黑马程序员技术交流社区
标题: 对于行指针的一点自己的理解 [打印本页]
作者: 堕落天使 时间: 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)就是直接取值。
这是行指针,二维数组相当于一个特殊的一维数组,如果从行来看可以看成一个数组
有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 |