指针定义的时候是指向一个地址,如:
int a = 10;
int *b = &a;
b中存储的是a的地址,解引用可以得到地址为a的变量的值,即*b
既然指针存储的是地址,那么二维指针指向的就是地址的地址,如:
int a = 10;
int *b = &a;
int **c = &b;
因为解引用得到的是值,那么指针存放的就是地址,因此c中存的是b的地址,*c就是b中的值,即a的地址
所以,如下代码:
int *p = *c;
因为*c是a的地址
那么代码等同于
int *p = &a;
或
int *p = b;
引用的用法是:
int a = 10;
int &b = a;
当对b复制的时候,如:
b = 30;
此时不是像对变量复制的过程那种在堆栈中新增加一个变量,找到变量b所在的地址,b地址存放的值是变量a的地址,因此给b赋值的过程如下:
找到变量b的地址,读取该地址下的值,即a的地址,之后通过a的地址,修改a地址下的值为30
如果引用过程中涉及类型转换,如:
double a = 3.14;
int &b = a;
b = 7;
实际上b没有改变a的值,因为对于有类型转换的引用,编译器实际是这样处理的:
int temp = a;
int &b = temp;
b = 7;
所以b更改的是临时的中间变量temp,而不是a
指向const的指针和const指针:
指针的读法是从右向左读,