main() { int*p1[3]; int p[3][3]={1,2,3,4,5,6,7,8,9}; for(int i=0;i<3;i++) { p1[i]=p[i]; } printf("%d",p1); printf("%d",p1+1); printf("%d",*(p1+1)); printf("%d",**(p1+1)); }
疑问: printf("%d",*(p1+1)); 为什么*(p1+1) 不等于4?而是4的地址??
那printf("%d",p1+1); 中的p1+1 又是求的什么??
添加 if((p1+1)==(*(p1+1)))
报错 提示: 操作数类型不兼容("int **" 和 "int *")
数组指针 是指针的指针吗???
http://blog.csdn.net/javaweb_research/article/details/6910138
printf("%d",p1);//
&p1[0]; *(*p1)才是p[0][0]printf("%d",p1+1);//
&p1[1]; *(*(p1+1))才是p[1][0]printf("%d",*(p1+1));//
p1[1]==&p[1][0];printf("%d",**(p1+1));//
*p[1]==p[1][0];
感谢:
尤其感谢陈皓 的回答
如果说,int a[3], a是int* 没有问题吧?a+1 是指针加1,其实也是int*没有问题吧。
a[1] 等价于 *(a+1) 没有问题吧?这个能想通,那二维数组就更没问题了。
如果我把p[3][3]写成下面这个样子你就明白了
p[0][] = (int*) p[0] = (int**) (p+0) = {1,2,3}
p[1][] = (int*) p[1] = (int**) (p+1) ={4,5,6}
p[2][] = (int*) p[2] = (int**) (p+2) ={7,8,9}
而 p1[i] 是 int*, p1就是int**, 所以说 p1+i 也是 int** ,*(p1+1)是int*, **(p1+1)是int。我说明白了吗?
陈皓
自己的理解
P1的地址->(3个整数的地址)
那么P1就是指向三个整数地址的地址 P1(地址)->(三个整数的地址)->三个整数值