c语言中多维数组的个人理解

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;                       
}

最后做出来的结果就是这样的:
在这里插入图片描述
结合起来看就很好理解了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值