c语言中多维数组的个人理解
多维数组跟多级指针很像,但是之前一直没怎么搞明白,今天做题遇到了,理了一下,写成了代码,以供理解.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int c[10] = { 0 };
printf("c:%d,%d\n", c, &c);
printf("c+1:%d,%d\n", c+1, &c+1);
//c代表首地址,&c代表整体的地址
//这就导致了c+1是移动一个字符,而&c+1是移动数组长度*1
int b[4][5] = { 0 };
printf("b:%d,%d\n", b, &b);
printf("b+1:%d,%d\n", b + 1, &b + 1);
//b代表首地址,&b代表整体地址
//这就导致b+1可以移动到下一行,而&b+1可以移动到下一个二维数组
//由以上可以看出数组的首元素地址与数组地址的本质上的不同
int addnum = 1;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
b[i][j] = addnum;
addnum++;
}
}
printf("b[1][2]:%d,%d\n",*(*(b+1)+2),b[1][2]);
printf("b[1][2]_address:%d,%d\n", *(b + 1) + 2, b[1]+2);
printf("b[1][3]_address:%d,%d,%d\n", *(b + 1) + 3, b[1] + 3,&b[1][3]);
printf("b[1]_address:%d,%d\n", b + 1, b[1]);
printf("b[1][0]_address:%d,%d\n", *(b + 1), &b[1][0]);
/*
应当分清b &b b+i b[i] *(b+i) *(b+i)+j b[i]+j *(*(b+i)+j) b[i][j]的区别
b:首行首地址
&b:数组首地址
b+i:i行的地址
b[i]:i行首地址
*(b+i):i行的首元素地址
*(b+i)+j:i行j列元素的地址
b[i]+j:i行j列元素的地址(与&b[i][j])
*(*(b+i)+j)==b[i][j],与指针和数组的关系一样
总结:&b是整个数组的位置,而b是整个数组下,第一个层次的单位,通过*(b+i)的
操作取下一个级,可以理解成多级指针.
*/
//下面是三维数组的验证
int a[3][4][5] = { 0 };
addnum = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int n = 0; n < 5; n++) {
a[i][j][n] = addnum;
addnum++;
}
}
}
printf("a[1][2][3]:%d,%d\n", *(*(*(a + 1) + 2) + 3), a[1][2][3]);
printf("a_address:%d,%d\n", a, &a);
printf("a+1_address:%d,%d\n", a+1, &a+1);
printf("a[1]_address:%d,%d\n", *(a+1), a[1]);
printf("a[1][2]_address:%d,%d\n", *(a+1)+2, a[1]+2);
printf("a[1][2][3]_address:%d,%d\n", *(*(a + 1) + 2)+3, a[1][2] + 3);
/*
a:首行首地址
&a:数组首地址
a+i:i行的地址
a[i]:i行首地址
*(a+i):i行的首元素地址
*(a+i)+j:i行j列元素首地址
a[i]+j:i行j列元素首地址(与&a[i][j]一样)
*(*(a+i)+j)+n:i行j列n纵深所在元素的地址
总结:'*'越多,a所代表的级数就越多,提供的多维数组位置的信息就越多,
*/
return 0;
}
最后做出来的结果就是这样的:
结合起来看就很好理解了