int b[4][5],就是先定义一个四个元素的一维数组,然后每个元素都是包含一个五个整型变量的一维数组。
我们知道,在一维数组中,数组名就是相当于数组第一个元素的指针,也就是第一个元素的地址。
二维数组的数组名,我们应该理解为array是指向包含了五个元素的数组的指针。
array是第0行的地址。
将二维数组看成一维数组,数组名指向第一个元素array[0],第一个元素是一个包含了array[0][0]array[0][1]array[0][2]array[0][3]array[0][4]的数组
#include <stdio.h>
int main()
{
int array[4][5] = {0};
printf("sizeof int: %dn", sizeof(int));
printf("array: %pn", array);
printf("array + 1: %pn", array + 1);
return 0;
}
输出结果如下
sizeof int: 4
array: 000000000062FDC0
array + 1: 000000000062FDD4
C0与D4相差16,所以array是指向包含了五个元素的数组的指针。array指向第0行,array+1指向第一行
*(array+1),即array+1的解引用(dereference)是什么?
将一个地址上的值取出来,我们称为解引用
*(array+1)==array[1],array[1]是*(array+1)的语法糖
语法糖是同一个操作的等价实现方式,使用语法糖简单,方便程序员写代码
array[1]可以看做array[1][0]的数组名,所以array[1]是array[1][0]的地址,所以*(array+1)是array[1][0]的地址
#include <stdio.h>
int main()
{
int array[4][5] = {0};
int i, j, k = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 5; j++)
{
array[i][j] = k++;
}
}
printf("array: %pn", array);
printf("*(array+1): %pn", array + 1);
printf("array[1]: %pn", array[1]);
printf("&array[1][0]: %pn", &array[1][0]);
printf("**(array+1): %dn", **(array+1));
return 0;
}
输出
array: 000000000062FDB0
*(array+1): 000000000062FDC4
array[1]: 000000000062FDC4
&array[1][0]: 000000000062FDC4
**(array+1): 5
第三个问题,*(*(array+1)+3)表示的是什么?
答:第一行第3列元素的值
#include <stdio.h>
int main()
{
int array[4][5] = {0};
int i, j, k = 0;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 5; j++)
{
array[i][j] = k++;
}
}
printf("*(*(array+1)+3): %dn", *(*(array+1)+3));
printf("array[1][3]: %dn", array[1][3]);
return 0;
}
输出
8
8
结论:
*(array+i)==array[i]
*(*(array+i)+j)==array[i][j]
*(*(*(array+i)+j)+k)==array[i][j][k]
数组指针和二维数组
请问如何解释下面这个语句?
int (*p)[3]=array;
array是一个指向三个元素的数组的指针,这个p也是指向一个三个元素的数组的指针,所以array可以赋值给p。
#include <stdio.h>
int main()
{
int array[2][3] = {{0, 1, 2}, {3, 4, 5}};
int (*p)[3] = array;
printf("**(p+1): %dn", **(p+1));
printf("**(array+1): %dn", **(array+1));
printf("array[1][0]: %dn", array[1][0]);
printf("*(*(p+1)+2): %dn", *(*(p+1)+2));
printf("*(*(array+1)+2): %dn", *(*(array+1)+2));
printf("array[1][2]: %dn", array[1][2]);
return 0;
}
输出
**(p+1): 3
**(array+1): 3
array[1][0]: 3
*(*(p+1)+2): 5
*(*(array+1)+2): 5
array[1][2]: 5