指向指针的指针(int **)
程序员文章站
2022-03-26 12:37:36
...
1. 指向整形指针变量的指针(int **)
示例代码1
#include<iostream>
using namespace std;
int main()
{
int a[5]={1,2,3,4,5},*p=a;
int **q = &p;
cout<<"a="<<a<<endl
<<"p="<<p<<endl
<<"&p="<<&p<<endl
<<"q="<<q<<endl
<<"&q="<<&q<<endl
<<"**q="<<**q<<endl;
for(int i=0;i<5;i++)
cout<<"&a["<<i<<"]"<<&a[i]<<endl;
return 0;
}
运行结果:
从运行结果可以看出,q指针所指向的空间中存储着指针p所在内存空间的地址,p指针所指向的内存空间中存储着数组a的首地址;故q表示取q所指空间中的值,**q表示q所指内存空间中的地址指向的那个内存空间中的值。(在c++中 星号(*)表示取内存空间中的值)。
为了便于理解,模拟内存存储情况:
2. 指向字符指针变量的指针(char **)
示例代码2
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char *a[]={"my","name"};
char **p = a;
for(int i=0;i<2;i++)
for(int j =0;j<strlen(a[i]);j++)
cout<<"&a["<<i<<"]"<<"["<<j<<"]="<<(void *)&a[i][j]<<endl;
for(int i=0;i<2;i++)
cout<<"&a["<<i<<"]="<<&a[i]<<endl
<<"a["<<i<<"]="<<(void *)a[i]<<endl;
cout<<"&p="<<&p<<endl
<<"p="<<p<<endl;
return 0;
}
运行结果
字符串指针输出遇到’/0’结束输出,其中(void *)用于提取地址,在字符指针中输出地址必须用这个方式。内存示意图如下:
从图中可以看出在64位系统中,一个字符指针占8个字节(在32位系统中一个字符指针占4个字节);一个字符(char)占一个字节;
参考:https://blog.csdn.net/g200407331/article/details/52610150