二维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[4][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
printf("arr=%p,arr+1=%p\n", arr, arr + 1); //输出显示二维数组arr的地址和一维数组arr[0]的地址是相同的,均为数组首元素的地址,其值和&arr[0][0]相同
printf("arr[0]=%p,arr[0]+1=%p\n", arr[0], arr[0] + 1); //arr[0]指向4字节长的数据对象,对arr[0]加1导致它的值增加4
printf("*arr=%p,*arr+1=%p\n", *arr, *arr + 1);//*arr和arr[0]是一样的
printf("arr[0][0]=%d\n", arr[0][0]);
printf("*arr[0]=%d\n", *arr[0]); //arr[0][0]和*arr[0]的值是相同的
printf("**arr=%d\n", **arr); //二维数组名必须两次取值才可以取出数组中存储的数据
printf("arr[2][1]=%d\n", arr[2][1]);
printf("*(*(arr+2)+1)=%d\n", *(*(arr + 2) + 1)); //分两步取二维数组元素可采用*结合+
system("pause");
return 0;
}
0039FA2C 0039FA30
从上表可以看出:arr、arr[0]、*arr的输出是一样的,它们都指向数组arr的起始地址,三者加1分别加了8,4,4这个结果的不同点在于?
从上表可以看出取数组中的某一元素有好几种方法:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[4][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
printf("arr=%p,arr+1=%p\n", arr, arr + 1); //输出显示二维数组arr的地址和一维数组arr[0]的地址是相同的,均为数组首元素的地址,其值和&arr[0][0]相同
printf("arr[0]=%p,arr[0]+1=%p\n", arr[0], arr[0] + 1); //arr[0]指向4字节长的数据对象,对arr[0]加1导致它的值增加4
printf("*arr=%p,*arr+1=%p\n", *arr, *arr + 1);//*arr和arr[0]是一样的
printf("arr[0][0]=%d\n", arr[0][0]);
printf("*arr[0]=%d\n", *arr[0]); //arr[0][0]和*arr[0]的值是相同的
printf("**arr=%d\n", **arr); //二维数组名必须两次取值才可以取出数组中存储的数据
printf("arr[2][1]=%d\n", arr[2][1]);
printf("*(*(arr+2)+1)=%d\n", *(*(arr + 2) + 1)); //分两步取二维数组元素可采用*结合+
system("pause");
return 0;
}
结果:
0039FA2C 0039FA34
0039FA2C 0039FA300039FA2C 0039FA30
1
1
1
6
6
arr | 0039FA2C | arr+1 | 0039FA34 |
arr[0] | 0039FA2C | arr[0]+1 | 0039FA30 |
*arr | 0039FA2C | *arr+1 | 0039FA30 |
arr[0][0] | 1 |
*arr[0] | 1 |
**arr | 1 |
arr[2][1] | 6 |
*(*arr+2)+1) | 6 |
(1)可以直接用arr[i][j]来获取i行j列的元素
(2)也可以采用指针*arr[i]来获取第i行的第一个元素
(3)也可以采用两次解引用来获取数组第一个元素
(4)也可以采用*和+的配合*(*arr+i)+j)来获取i行j列的元素。