小甲鱼 P24 指针和二维数组
小甲鱼 P24 指针和二维数组
- 二维数组:是一维数组的线性扩展
- array表示的是什么?
array代表指向包含5个元素的指针(用一维数组的角度来理解)
- *(array+1)表示的是什么?
*(array+1)表示:array+1的解引用,相当于array[1](语法糖),指向第二行的首地址
解引用:取值运算符(*)作用于地址之上(array+1),取出地址值(返回内存地址中保存的值)
#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):%p\n", (*(array+1)));
printf("array[1]: %p\n", array[1]);
printf("array[1][0]: %p\n", array[1][0]);
printf("**(array+1):%d\n", **(array+1)); //双层解引用
return 0;
}
结果:
- *(*(array+1)+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):%p\n", (*(array+1)));
printf("array[1]: %p\n", array[1]);
printf("array[1][0]: %p\n", array[1][0]);
printf("*(*(array+1)+3):%d\n", *(*(array+1)+3));
printf("array[1][3]: %d\n", array[1][3]);
return 0;
}
结果:
- 结论:
*(array+i) == array[i]
*(*(array+i)+j) == array[i][j]
*(*(*(array+i)+j)+k) == array[i][j][k]
- 数组指针和二维数组
初始化二维数组:
int array[2][3] = {{0, 1, 2}, {3, 4, 5}};
定义一个数组指针:
int (*p)[3];
- int (*p)[3] = array;
#include <stdio.h>
int main()
{
int array[2][3] = {{0, 1, 2}, {3, 4, 5}};
int (*p)[3] = array;
printf("**(p+1): %d\n", **(p+1));
printf("**(array+1): %d\n", **(array+1));
printf("array[1][0]: %d\n", array[1][0]);
printf("*(*(p+1)+2): %d\n", *(*(p+1)+2));
printf("*(*(array+1)+2): %d\n", *(*(array+1)+2));
printf("array[1][2]: %d\n", array[1][2]);
}
结果: