深度刨析多维数组与指针

1.多维数组与指针

数组名就为首元素地址

当定义如下数组后:

int arr[2][3][2] = { 1 };    //这里初始化只有第一个元素为1,其余为0

逻辑上可以理解为一个空间矩阵,实际也只是内存中线性存储

  • 而我们知道数组名就是首元素地址,所以arr[1] 可以理解为:* (arr+1),arr[1]就是第二个元素的地址(即维护了6-11元素)
	for (i = 0; i < 2; i++) {
		printf("arr[%d]  :%p \n",i, arr[i]);
		printf("*(arr+%d):%p \n",i,*(arr+i));
	}

  • arr[1][1]可以理解为:* ( * (arr+1) + 1 ),就是第二个元素中 3份中 第二份 的地址(即维护了8-9的元素)
	for (i = 0; i < 2; i++) {
		for (j = 0; j < 3; j++) {
			printf("arr[%d][%d]          :%p \n", i,j, arr[i][j]);
			printf("* (*(arr + %d) + %d) : % p \n", i,j,*( *(arr + i)+j ));
		}
	}

  • arr[1][1][1]可以理解为:*(* ( * (arr+1) + 1 ) + 1 )就是取第二个元素中 3份中 第二份 的第二个元素
	for (i = 0; i < 2; i++) {
		for (j = 0; j < 3; j++) {
			for (int k = 0; k < 2; k++) {
				printf("arr[%d][%d][%d]          :%d \n", i, j,k, arr[i][j][k]);
				printf("(*(*(arr + %d) + %d)+%d) : %d \n", i, j,k, *(*(*(arr + i) + j)+k));

			}
		}
	}

 

 实际数组的方括号与指针的运算有异曲同工之妙

很多情况下我们可以将数组与指针的运算相互转换,如:

定义一个int arr[2][3],int* p=&arr,之后就可以用*(p+i)的操作取数,存数,等价于arr [ i ] [ j ]

2.多维数组的应用,实现一个字符数组的大小排序

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char s[][10] = { "12","23","34","45","56" };  

	char* s1[5];			//记录字符串数组s的每个元素的地址
	char** s2 = s1;			//记录s1数组的地址
	char s3[10];			//辅助数组,用来暂存要交换的字符串
	int i, j;
	printf("排序前为:\n");
	for (i = 0; i < 5; i++)
		printf("%s ", s[i]);
	printf("\n");
	for (i = 0; i < 5; i++) {
		s1[i] = s[i];		//将s数组的每个元素的地址让s1数组存储
	}
	for (i = 0; i < 4; i++) {             //每次循环选出对应i位置的最大字符数组
		for (j = i + 1; j < 5; j++) {     //第一个与第二个比较选出最大的,再于第三比较选出最大,直至与最后一个比较选出最大
			if (strcmp(*(s2 + i), *(s2 + j) )< 0)  {     
				//交换的过程
				strcpy(s3, *(s2 + i));            
				strcpy(*(s2 + i), *(s2 + j));
				strcpy(*(s2 + j), s3);
			}
		}
	}
	printf("排序后为:\n");
	for(i=0;i<5;i++)
		printf("%s ", s[i]);
	printf("\n");
	
}

测试:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值