一.指針和二維數組
1.如a是一個二維數組,則數組中的第i行可以看作是一個一維數組,這個一維數組的數組名是a[i]。
2.a[i]代表二維數組中第i行的首個元素的地址,即a[i][0]的地址。
二.進一步思考
二維數組可以看作是數組的數組,本質還是一維數組。所以我們可以把二維數組的一行看作是一個數組元素,此時二維數組就會變成一個一維數組。如下圖所示
此時,二維數組a[2][2]變成了只有倆個元素a[0]和a[1]的一維數組。因為在一維數組中p=&a[0]可以簡寫成p=a;
所以由此得出:
數組名a就是一維數組元素a[0]的地址,即二維數組a中第0行的地址。a+1則是二維數組a中第1行的地址。所以a+i則是二維數組a中第i行的地址。
結論:
a+i與a[i]的地址相同的。
這里需要注意的是:*(a+i)+j才是a[i][j]的地址。并不是(a+i)+j是a[i][j]的地址。
因為a+i表示的是二維數組中第i行的地址,而不是第i行首個元素的地址,此時a+i表示的是整個第i行數組,*a+i表示的才是第i行數組中首個元素的地址。也就是說雖然a和*a的值相同,但是表示的意義不同。
舉例驗證:
#include <stdio.h>int main(void)
{int a[2][2]={0,1,2,3};int i = 0;int j = 0;for(i=0;i<2;i++){for(j=0;j<2;j++){printf("a[%d][%d] addr is %p,value is %d\n",i,j,a[i]+j,*(a[i]+j));}}printf("**********************************\n");for(i=0;i<2;i++){for(j=0;j<2;j++){printf("a[%d][%d] addr is %p,value is %d\n",i,j,*(a+i)+j,*(*(a+i)+j));}}printf("%p\n",*a);printf("%p\n",*a+1);printf("%p\n",a);printf("%p\n",a+1);return 0;}
運行結果:
三.視頻教程
62.指針和二維數組(2)_嗶哩嗶哩_bilibili