int a = 10; //* 表示解引用 //方法1 int * p = NULL; //point 一般置为空指针,后续再给指向 p = &a; //&为取地址符 //方法2 int * p = &a; a = 10 &a = 0XA0 //a的地址,这个地址是我们假设的 p = 0XA0 //p存放的是a的地址 &p = 0XB0 //指针p自身的地址 *p = 10 //将p解引用,获得p指向的值,即a值 拓展: &(*p) = 0XA0
原理
int a = 10; int *p1 = &a; int **p2 = &p1; a = 10 &a = 0XA0 p1 = 0XA0 *p1 = 10 &p1 = 0XB0 p2 = 0XB0 *p2 = 0XA0 **p2 = 10 &p2 = 0XC0 **p2理解为 *(*p2),就是对p2指向的再一次解引用 由此可见,多次指针相当于连续套娃,每层指针指向上一层
原理
void test1(int *p){ cout << p << " " << *p; } void test2(int **p){ cout << p << " " << **p; } int main(){ int *p1 = NULL; int a = 10; p1 = &a; test(p1); int **p2 = &p1; test(p2); //或者 test(&p1); }
const修饰指针有三种情况
int a = 10; int b = 10; //const修饰的是指针,指针指向可以改,指针指向的值不可以更改 const int * p1 = &a; p1 = &b; //正确 //*p1 = 100; 报错 //const修饰的是常量,指针指向不可以改,指针指向的值可以更改 int * const p2 = &a; //p2 = &b; //错误 *p2 = 100; //正确 //const既修饰指针又修饰常量 const int * const p3 = &a; //p3 = &b; //错误 //*p3 = 100; //错误 }
技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量