第一次看视频的时候,在行指针这块就晕了,结果又看了一遍,多少理解了一些,至少不那么晕了,总结了一点东西,有错误的地方感谢指正。关于行指针和列指针。 对于一个二维数组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配合还是一级指针 所以再加一个*就是取值了
|