cpp二级指针,指针数组的问题
在学习c++的指针数组和二级指针后,我上机实验了一下,来区分两者的区别
但是学习过程中发现,指针数组首元素地址(存放的第一个指针元素)竟然与指针数组的地址不一样,然后输出(p1+0)的时候明白了
int *p1[4];
for(int i=0;i<4;i++)
{
p1[i]=new int[10];
}//指针数组中的指针动态分配整形数组
for(int i=0;i<4;i++)
for(int i1=0;i1<10;i1++)
{
p1[i][i1]=i1;//赋值数组中的元素
}`
cout<<&p1<<" "<<p1<<" "<<(p1+0)<<" "<<p1[0]<<" "<<*p1[0]<<endl;
//结果输出0x6ffda0 0x6ffda0 0x6ffda0 0xb958f0 0
原来是p1[0]指的是p1指针数组的第0号元素指针,所以输出的是该指针的值,然而这里为什么输出的是地址呢?
这是因为该指针又指向了一个整形数组,所以输出的值应该整形数组的地址,类似
int a[10];
cout<<a<<endl;
所以想要输出真正的指针首元素地址,应该是(p1+0),对应p1,即指针数组变量。
同时,要注意到这里的&p1与p1是相同的,但是二级指针就不一样了
int **p;//定义一个二级指针
cout<<&p<<" "<<p<<endl;
//第一个是指针变量本身的地址,第二个会输出指针未初始化随机分配的地址
p=new int*[4];
//动态分配给指针变量一个指针数组 (地址存放的是指针数组的地址)
cout<<&p<<endl;
//这里经过动态分配后地址将会变化
for(int i=0;i<4;i++)
{
p[i]=new int[10];//等同于*(p+i),也就是令该指针数组中的第i号分配一个整形数组
}
for(int i=0;i<4;i++)
for(int i1=0;i1<10;i1++)
{
p[i][i1]=i1;
}
cout<<&p<<" "<<p<<" "<<(p+0)<<" "<<p[0]<<*p[0]<<endl;
//输出0x6ffdd0 0x7f1430 0x7f1430 0x7f1480 0
这里发现&p输出的值与p不一样,而指针数组输出的则一样,这就是指向指针数组的二级指针与指针数组的不同之处,二级指针是令一个指针存放指针数组,所以指针变量的地址并不是指针数组的地址,而若是指针数组,它本身的地址就是该变量的地址,相当于一个数组变量,这个变量的地址就是数组的地址。
学这个是相当的绕啊。