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];
感谢:- qq120848369
- supermegaboy大的数组与指针的艺术http://blog.csdn.net/supermegaboy/article/category/622235
尤其感谢陈皓 的回答
如果说,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(地址)->(三个整数的地址)->三个整数值 -
P1+1就等于指向第二个整数地址的地址 因此*(P1+1) 就等于第二个整数的地址 及4的地址,所以**(P1+1)=4;
-