C_多维数组和指针
用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。
先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 :
定义int a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};
则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为2000
则有……
第一行地址a[0] | 2000 a[0][0] | 2004 a[0][1] | 2008 a[0][2] | 2012 a[0][3] |
---|---|---|---|---|
存放数据 | 1 | 3 | 5 | 7 |
第二行地址a[1] | 2016 a[1][0] | 2020 a[1][1] | 2024 a[1][2] | 2028 a[1][3] |
存放数据 | 9 | 11 | 13 | 15 |
第三行地址a[2] | 2032 a[2][0] | 2036 a[2][1] | 2040 a[2][2] | 2044 a[2][3] |
存放数据 | 17 | 19 | 21 | 23 |
表 示 形 式 | 含义 | 地 址 |
---|---|---|
a | 二维数组名,指向一维数组a[0],即0行首地址 | 2000 |
a[0], *(a+0), *a | 0行0列元素地址 | 2000 |
a+1,&a[1] | 1行首地址 | 2016 |
a[1],*(a+1) | 1行0列元素a[1][0] 的地址 | 2016 |
a[1]+2, *(a+1)+2 , &a[1][2] | 1行2列元素a[1][2] 的地址 | 2024 |
*(a[1]+2) , *(*(a+1)+2) , a[1][2] | 1行2列元素a[1][2] 的值 | 元素值为13 |
/**
* 一维数组里面存放的是二维数组的地址
* 二维数组才是真正存放的是数值
*/
a[i][j] = *(*(a+i)+j)
a[i][j]...[z]=*(*(...*(a+i)+j)...+z)
#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]。
二维数组的指针变量说明的一般形式为:
类型说明符 (*指针变量名)[长度]
其中“类型说明符”为所指数组的数据类型。*
表示其后的变量是指针类型。“长度”表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。
用指针输出二维数组的数值
#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");
}
}