指针是一个比较复杂的东西,本章就做简单了解,以后写一个专题来讲解指针
给指针赋值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指向的内存的值。
}
|