指针数组相当于二级指针,printf("%p\n",a[0]);//与x相同,为什么呢?a[0]不是一个变量的地址吗?

#include<stdio.h>

int main()
{
int *a[2];
int c=10,d=20;
a[0]=&c;
a[1]=&d;
int**x=*(int***)&a;//&a三级地址
printf("%p\n",x);//二级地址
printf("%p\n",a);
printf("%p\n",&a[0]);//相当于二级地址与a地址相同,与x不相同
printf("%p\n",a[0]);//与x相同,为什么呢?a[0]不是一个变量的地址吗?
printf("---------------------\n");
int a0 =10;
int* a1=&a0;
int**aa =&a1;
int***aaa=&aa;
int** xx = *aaa;//类似于int**x=*(int***)&a;
printf("%p\n",xx);//二级地址
printf("%p\n",&a1);//二级地址相同
}

第1个回答  2012-01-03
P指针和数组只是相似,并不是相等,因为数组的名称是一个右值,不是左值,
也就是说,数组a的名称只是一个值,不是变量,在内存中是不占用空间的,
,假设有个数组int a[],你对a取地址是不合法的,但是为了方便,编译器会假设是合法的
其值等于a.就是说a==&a,这和指针不同, int *p=0,在内寸中p占用了一个4字节空间,有他的虚拟地址。
明白了这些之后,就很好理解了,(int***)&a和(int***)a是一样的*a==a[0]
ps:我是做linux内核的,三级指针在实际编程中很少用到,唯一可能用到的地方就是将三级指针看做对一个二维数组取地址的操作,你这种用法很销魂。追问

int**x=*(int***)&a;//本来&a就是三级地址,这里强转是因为&a是对指针数组名取地址,编译器不认识?
所以要强转为三星?
int a[],你对a取地址是不合法的,但是为了方便,编译器会假设是合法的
其值等于a.就是说a==&a// a与&a地址不相同呀,你的意思是即使不相同,因为是数组也算相同吗?

第2个回答  2012-01-03
"printf("%p\n",a[0]);//与x相同,为什么呢?a[0]不是一个变量的地址吗?"
(1) 既然你懂得&a[0]与a相同,那么在前面的这两句
a[0]=&c;
int**x=*(int***)&a;//&a三级地址
这里的&a[0]==(int***)&a ,又前面还有一个“*”所以这里相当于x=a[0]=&c;
(2)没错a[0]是一个变量的地址。
明白了吧追问

又前面还有一个“*”//"*"这是是什么意思?
&a[0]==(int***)&a//为啥相等呀?&a[0]与a的地址相同呀

追答

"*"指针运算符;好好看书^_^
因为a是地址常量,&a==a;所以&a[0] == &a==a;
另外你这样写是不规范的。

本回答被提问者和网友采纳
相似回答