多维数组与指针
用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。
但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。
多维数组元素的地址
先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 :
定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000
则有……
内存中数据存放图示
输出二维数组有关的值
#include <stdio.h>
void main()
{
int a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
printf("a: %d\n", a);
printf("*a: %d\n", *a);
printf("a[0]: %d\n", a[0]);
printf("&a[0]: %d\n", &a[0]);
printf("&a[0][0]: %d\n", &a[0][0]);
printf("a+1: %d\n", a + 1);
printf("*(a+1): %d\n", *(a + 1));
printf("a[1]: %d\n", a[1]);
printf("&a[1]: %d\n", &a[1]);
printf("&a[1][0]: %d\n", &a[1][0]);
printf("a+2: %d\n", a + 2);
printf("*(a+2): %d\n", *(a + 2));
printf("a[2]: %d\n", a[2]);
printf("&a[2]: %d\n", &a[2]);
printf("&a[2][0]: %d\n", &a[2][0]);
printf("a[1]+1: %d\n", a[1] + 1);
printf("*(a+1)+1: %d\n", *(a + 1) + 1);
printf("*(a[1]+1): %d\n", *(a[1] + 1));
printf("*(*(a+1)+1): %d\n", *(*(a + 1) + 1));
}
指向多维数组元素的指针变量
把二维数组a分解为一维数组a[0],a[1],a[2]之后,设p为指向二维数组的指针变量。可定义为:
int (*p)[4]
它表示p是一个指针变量,它指向包含4个元素的一维数组。若指向第一个一维数组a[0],其值等于a,a[0],或&a[0][0]等。
而p+i则指向一维数组a[i]。
从前面的分析可得出*(p+i)+j是二维数组i行j 列的元素的地址,而*(*(p+i)+j)则是i行j列元素的值。
二维数组指针变量说明的一般形式为:
类型说明符 (*指针变量名)[长度]
其中“类型说明符”为所指数组的数据类型。“*”表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。
用指针变量输出二维数组元素的值
#include <stdio.h>
void main()
{
int a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
int(*p)[4];
int i, j;
p = a;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%2d ", *(*(p + i) + j));
}
printf("\n");
}
}
课后题
通过输入指定行数和列数打印出二维数组对应任一行任一列元素的值。
#include <stdio.h>
void main()
{
int a[3][4] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23 };
int(*p)[4], i, j;
p = a;
printf("i = ");
scanf("%d", &i);
while (i > 2 || i < 0)
{
printf("i = ");
scanf("%d", &i);
}
printf("j = ");
scanf("%d", &j);
while (j > 3 || j < 0)
{
printf("j = ");
scanf("%d", &j);
}
printf("a[%d, %d] = %d\n", i, j, *(*(p + i) + j));
}