黑马程序员技术交流社区

标题: 对于行指针的一点自己的理解 [打印本页]

作者: 堕落天使    时间: 2015-9-27 10:50
标题: 对于行指针的一点自己的理解

第一次看视频的时候,在行指针这块就晕了,结果又看了一遍,多少理解了一些,至少不那么晕了,总结了一点东西,有错误的地方感谢指正。
关于行指针和列指针。
对于一个二维数组inta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
三行四列
  
1
  
  
3
  
  
5
  
  
7
  
  
9
  
  
11
  
  
13
  
  
15
  
  
17
  
  
19
  
  
21
  
  
23
  
  
a[0]
  
  
a[0]+1
  
  
a[0]+2
  
  
a[0]+3
  

a[0]这一行是列指针,指向了第一行的每一个元素。相当于一级指针,因为直接指向元素,而不是地址。
所以:*(a[0]+i)就是直接取值。
  
a
  
  
a+1
  
  
a+2
  
  
a+2
  

这是行指针,二维数组相当于一个特殊的一维数组,如果从行来看可以看成一个数组
有4个元素。a[0],a[1],a[2],a[3];这四个元素都是地址,而行指针指向他们,所以行指针可以看成是二维指针。所以要用“**”,才可以取到元素的值。
所以:a+1是一个二级指针,指向a[1],而a[1]存的是第2行的首地址。
*(a+1)是a[1]中存的地址,**(a+1)才是第2行第一个元素的值。

printf("p1     =%p\n",p1);
    printf("&p     =%p\n",&p);
    printf("*p1    =%p\n",*p1);
    printf("**p1   =%d\n",**p1);
    printf("a+1    =%p\n",a+1);
    printf("&a[1]  =%p\n",&a[1]);
    printf("*(a+1) =%p\n",*(a+1));
    printf("**(a+1)=%d\n",**(a+1));
结果是:
p1      =0x7fff5fbff750
&p      =0x7fff5fbff750
*p1     =0x7fff5fbff75c
**p1    =9
a+1     =0x7fff5fbff780
&a[1]   =0x7fff5fbff780
*(a+1)  =0x7fff5fbff780
**(a+1) =9
难点
为什么p1和*p1的值不同,而a+1和*(a+1)的值却是相同的。
p1是二级指针,它的值是一级指针的地址。而这个指针是定义过的,有自己的地址。
a+1只是相当于一个二级指针,它指向的指针并没有分配新的地址,所以值是相同的。

所以才有:
a +j            代表的是a[j]的地址
*(a + j) 代表的是a[j]的值
*(*(a+i)+j)     与*(a + j)等价
解析:a+i是二级指针,*(a+i)就是一级指针,和j配合还是一级指针
所以再加一个*就是取值了







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2