现在的位置: 首页 > 综合 > 正文

指针 二维数组的问题

2013年02月16日 ⁄ 综合 ⁄ 共 1060字 ⁄ 字号 评论关闭

 

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;
  •  
  • 抱歉!评论已关闭.