一维数组
int num[10] = {1,2,3,4,5,6,7,8,9};
/*数组名是首元素地址,即整型指针,而我们知道指针加减整数代表访问权限的大小*/
num = num + 0 = &num[0]
num + 1 = &num[1]
num + 2 = &num[2]
num + 3 = &num[3]
............
/*指针解引用就是对应地址的值*/
*(num) = *(num + 0) = num[0]
*(num + 1) = num[1]
*(num + 2) = num[2]
*(num + 3) = num[3]
............
这里区分一个概念: 数组首元素地址 与 数组地址
数组首元素地址: 即数组名arr或者&arr[0]
数组地址: 即整个数组的地址 &arr.
比如一个数组是
int arr[5] = {1,2,3,4,5};
数组首元素地址是**---->**
&arr[0]
或者arr
数组地址是 ------>
&arr
二维数组
二维数组其实本质是一维数组,由每一行拼接而成.
二维数组的数组名是首元素地址,而二维数组的首元素是 第一行数组,所以说二维数组的数组名就是 第一行数组的数组地址
而arr[n] 就代表是某一行的数组名,即某一行的数组的首元素地址
比如数组
arr[3][3]
那么arr[0]
就是第一行数组的数组名
,arr[1]
就是第二行数组的数组名
…int arr[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
他的结构就是这样:
所以:
int arr[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; /*arr是第一行的 数组地址, 即等于该行的 数组名取地址*/ arr = arr + 0 = &arr[0] arr + 1 = &arr[1] arr + 2 = &arr[2] arr + 3 = &arr[3] ............ /*所以,可以知道有以下表达*/ *(arr + 0) + 0 = *&arr[0] + 0 = arr[0] + 0 = &arr[0][0] *(arr + 0) + 1 = *&arr[0] + 1 = arr[0] + 1 = &arr[0][1] *(arr + 0) + 2 = *&arr[0] + 2 = arr[0] + 2 = &arr[0][2] *(arr + 1) + 0 = *&arr[1] + 0 = arr[1] +0 = &arr[1][0] *(arr + 1) + 1 = *&arr[1] + 1 = arr[1] +1 = &arr[1][1] *(arr + 1) + 2 = *&arr[1] + 2 = arr[1] +2 = &arr[1][2] ........ /*所以解引用arr就相当于得到某一行数组的数组名*/ *(arr) = *(arr + 0) = arr[0] *(arr + 1) = arr[1] *(arr + 2) = arr[2] *(arr + 3) = arr[3] ............. /*同理,可以知道有以下表达*/ **arr = *(*(arr + 0) + 0) = arr[0][0] *(*(arr + 1) + 1) = arr[1][1] *(*(arr + 2) + 2) = arr[2][2] *(*(arr + 3) + 3) = arr[3][3] ............