user-0 提问: 间接访问为什么用**表示？

回复:
user: user-1
content: 弱爆了，感觉要仔细想想

user: user-2
content: 引用 9 楼 过程中的美好 的回复:[quote=引用 8 楼 gouyanfen的回复:][quote=引用 7 楼 过程中的美好 的回复:] 各位大神能不能简单直白点呢 因为例子要把定义和赋值放到一句 你可以这样看*(*p2)=&p1; *可以理解为指向后面表达式值的空间 *p2为定义为指针变量变为他分配一个地址，返回这个地址，这个并不是设计**而是*号的嵌套使用 比如这个例子，你也可以这样定义     int v2=1;     int *p1=&v2;     int *p2=0;     p2=(int*)&p1;     printf("%X,%X,%d,%d",p2,p1,*(int*)*p2,*p1);   [/quote] FFA6421C, FFA64220,1,1[/quote] 这样和你说的意思就是其实*一个同样可以表达** **是一种简化的写法，你理解了指针，十个*都是一个道理 int *******point;也不是很难理解的

user: user-0
content: 其实我的理解是*只是代表这个申明的被声明对象是地址变量，*只是一个标示，并没有实际作用。打破这个观点，我就能理解了，谢谢

user: user-0
content: 引用 8 楼 gouyanfen的回复:[quote=引用 7 楼 过程中的美好 的回复:] 各位大神能不能简单直白点呢 因为例子要把定义和赋值放到一句 你可以这样看*(*p2)=&p1; *可以理解为指向后面表达式值的空间 *p2为定义为指针变量变为他分配一个地址，返回这个地址，这个并不是设计**而是*号的嵌套使用 比如这个例子，你也可以这样定义     int v2=1;     int *p1=&v2;     int *p2=0;     p2=(int*)&p1;     printf("%X,%X,%d,%d",p2,p1,*(int*)*p2,*p1);   [/quote] FFA6421C, FFA64220,1,1

user: user-3
content: 定义成哪样都不会算错，关键是使用上面，用**更方便 你要用二级指针访问int，怎么更方便？

user: user-0
content: 引用 14 楼 WindyValley的回复:[quote=引用 10 楼 过程中的美好的回复:]其实我的理解是*只是代表这个申明的被声明对象是地址变量，*只是一个标示，并没有实际作用。打破这个观点，我就能理解了，谢谢 然后11楼gouyanfen想表达的意思，按我的想说的就是： 在实际使用指针的时候（也就是定义指针的那条语句之外的地方），*不再是说明符，而是叫做提领运算符，它的作用是根据操作数中存储的地址来读取内存然后返回到程序（作为运算符有返回值不奇怪吧），你定义指针的时候给的数据类型决定了它在读取内存时读多少个字节。比如bool型的指针在读取内存的时候就只读一个字节，因为bool变量就只占一个字节。但因为int型变量的字节数与指针变量的字节数是相同的，所以即使我进行了这样的操作： int var=0; int *p1=&var; int *p2=(int*)p1; cout<<*p2<<endl; 仍然可以输出p1的地址，因为按int的字节数读取内存的时候并没有丢失哪怕一个字节的数据（从数据存储的角度来讲，指针跟int型整数是等效的）。但这种把一级指针当二级指针用的操作，也就只有在int上有效，换了其他类型的数据，读取的字节数改变，就不行了。 （第三行使用强制类型转换，因为编译器认为一级指针的地址应该赋给二级指针，直接赋给p2会给出警告或编译错误）[/quote] 谢谢，我更理解了。。。

user: user-4
content: 引用 10 楼 过程中的美好的回复:其实我的理解是*只是代表这个申明的被声明对象是地址变量，*只是一个标示，并没有实际作用。打破这个观点，我就能理解了，谢谢 然后11楼gouyanfen想表达的意思，按我的想说的就是： 在实际使用指针的时候（也就是定义指针的那条语句之外的地方），*不再是说明符，而是叫做提领运算符，它的作用是根据操作数中存储的地址来读取内存然后返回到程序（作为运算符有返回值不奇怪吧），你定义指针的时候给的数据类型决定了它在读取内存时读多少个字节。比如bool型的指针在读取内存的时候就只读一个字节，因为bool变量就只占一个字节。但因为int型变量的字节数与指针变量的字节数是相同的，所以即使我进行了这样的操作： int var=0; int *p1=&var; int *p2=(int*)p1; cout<<*p2<<endl; 仍然可以输出p1的地址，因为按int的字节数读取内存的时候并没有丢失哪怕一个字节的数据（从数据存储的角度来讲，指针跟int型整数是等效的）。但这种把一级指针当二级指针用的操作，也就只有在int上有效，换了其他类型的数据，读取的字节数改变，就不行了。 （第三行使用强制类型转换，因为编译器认为一级指针的地址应该赋给二级指针，直接赋给p2会给出警告或编译错误）

user: user-4
content: 引用 10 楼 过程中的美好的回复:其实我的理解是*只是代表这个申明的被声明对象是地址变量，*只是一个标示，并没有实际作用。打破这个观点，我就能理解了，谢谢 *在定义指针变量的时候的确是说明符，用来说明定义的是指向某一类型变量的指针，而不是常规变量，这个类型就是*p前面的类型。 **ptr_2前面的**是说明这是一个二级指针，也就是说这个指针ptr_2所指向的变量本身就是一个一级指针（也就是指向非指针变量的指针），虽然编译器是“int  **ptr_2”这样去解析的（因为指针说明符*和引用说明符&都是要在定义变量的时候跟在变量名前面），但其实你可以这样去理解“int*     *ptr_2” 前面他们说的二维数组的说法是错的（虽然二级指针可以通过分配空间成为二维数组）

user: user-5
content: 二维动态数组  int **p; p = new int*[num];  for(int i=0; i <num; ++i)  p[i] = new int[num2]; //  for(int m=0;m <num;m++)  delete[] p[m];  delete[] p;

user: user-2
content: 引用 7 楼 过程中的美好 的回复:各位大神能不能简单直白点呢 因为例子要把定义和赋值放到一句 你可以这样看*(*p2)=&p1; *可以理解为指向后面表达式值的空间 *p2为定义为指针变量变为他分配一个地址，返回这个地址，这个并不是设计**而是*号的嵌套使用 比如这个例子，你也可以这样定义     int v2=1;     int *p1=&v2;     int *p2=0;     p2=(int*)&p1;     printf("%X,%X,%d,%d",p2,p1,*(int*)*p2,*p1);

user: user-0
content: 各位大神能不能简单直白点呢🌝

user: user-6
content: 呃，好吧~~我也不懂啊。  可能因为*point_1没有灵魂而不直接使用，**point_1有灵魂，就拿来使用了吧。。。

user: user-0
content: 为什么要用“**”表示，而不直接用“*”，指针变量也是有地址的，请仔细看问题

user: user-6
content: 1：用于表示二维数组。 2：作为函数参数传递 ，类似于c++的传引用& ~~  请楼下继续补充

user: user-0
content: 引用 1 楼 user-7的回复:因为point_1要保存的是point_2的指针，而point_2本身就是指针； 因此使用**类型就很明显了：就是指向指针的指针。  举个实际例子：var代表你家的房子，301代表你家房号，如果你把房号的标签存在一个405号邮箱里，如果找到房间内容呢？  这里point_1 值为405， point_2为301，var为房间。 显然，你不懂我意思啊

user: user-7
content: 因为point_1要保存的是point_2的指针，而point_2本身就是指针； 因此使用**类型就很明显了：就是指向指针的指针。  举个实际例子：var代表你家的房子，301代表你家房号，如果你把房号的标签存在一个405号邮箱里，如果找到房间内容呢？  这里point_1 值为405， point_2为301，var为房间。