C++学习笔记-指针简单了解

指针是一个比较复杂的东西,本章就做简单了解,以后写一个专题来讲解指针

给指针赋值0是允许的

给指针赋值0是允许的,指针就是保存个地址,那保存0也是完全可以的,只要不对这个指针进行读写操作就不会有问题。

1
2
3
4
5
6
int main()
{
	void* ptr1 = 0;
	void* ptr2 = nullptr;
	// std::cout << *(int*)ptr1 << std::endl; // 取值就会报错,空指针异常,因为内存地址0是无效的。
}

取地址符(&)和取值运算符(*)

1
2
3
4
5
6
int main()
{
	int var1 = 8;
	int* ptr3 = &var1; // & 取地址符,取变量var1的地址。
	std::cout << *ptr3 << std::endl; // * 是取值运算符,取指针ptr3地址所指向的内存的值。
}

指针需要类型吗?

指针实际上不需要类型,它只是保存了一个内存地址,如果我们非要给它指定一个类型,那只是说,这个地址的数据,被假设为我们给的类型,除此之外,它没有任何意义。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int main()
{
	int var2 = 8;
	// void*类型的指针
	void* ptr4 = &var2;
	std::cout << *(int*)ptr4 << std::endl; // 先将ptr4转换成int*类型,再取值

	/*
	以上两种方法都能正常取值。从这里可以看出,指针的类型对于指针来说是无关紧要的。
	指针实际上不需要类型,类型只是方便我们自己使用。
	*/
}

什么是二级指针?多级指针?

1
2
3
4
5
6
int main()
{
	int** ptr5 = &ptr4; // 指针本质上也是一个变量,它可以指向另一个指针,这就是多重指针。
	std::cout << *ptr5 << std::endl; // 取ptr5指向的内存的值,里面是指针ptr4的地址
	std::cout << **ptr5 << std::endl; // 取两级,也就是ptr4指向的内存的值。
}
updatedupdated2025-03-032025-03-03