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");
}
测试: