Record25—多维数组的本质
程序员文章站
2024-03-04 15:36:41
...
目录
多维数组的本质
在之前的博客中也经常发现多维数组在通过指针控制内存的时候,会发现指针向后移动一个元素,内存空间向后移动多个元素的问题,想弄明白这一点,就要探究一下多维数组的本质了!
首先,创建一个多维数组方便后续实验:
void main()
{
int a[3][5];
int c[5]; //&c + 1;
int b[10]; //b代表数组首元素的地址 &b代表这个数组的地址 &b+1相当于指针后移4*10个单位
printf("hello...\n");
system("pause");
return;
}
那么数组a是一个多维数组,再设置一个a+1,看看这俩有啥区别:
a + 1;
printf("a:%d, a+1:%d \n", a, a + 1);// 4*5
最后,输出显示:
说明"a"到"a+1",从64跳到84, 一下子多了20个单元,由此,推出a的本质就是一个指向c数组的一个指针,一个数组指针。每次往后跳一维的维数。(关于数组指针见上一篇博客)
下面我们对这个结论进行验证,运行如下两个循环,如若结果一致,则证明结论正确:
//以数组进行控制内存
{
int i = 0, j = 0, tmp = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
a[i][j] = ++tmp;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d \n", a[i][j]);
}
}
}
//以数组指针控制内存
{
int i = 0, j = 0;
int(*myArrayPoint)[5];
myArrayPoint = a;
for (i=0;i<3;i++)
{
for (j=0;j<5;j++)
{
//myArrayPoint[i][j] = ++tmp;
printf("%d \n", myArrayPoint[i][j]);
}
}
}
运行显示两个循环打印出的结果相同,可以证明多维数组的本质是数组指针。是一个指向低维的数组指针。a+1每次都跳固定的维数。维数是多少,就跳多少,同样道理,定义一个"array[10][30]",那么每次array+1,每次跳的是30个单元了就。
即:
"array+i",相当于 第i行的首地址,这同时也是个二级指针;
"(*(array + i))" ,相当于一级指针了就。因为(array+i)相当于二级指针,取对其“*”后,相当于回到了一级指针首地址了;
"(*(array + i)+j)", 如果,对首地址再加一(*(array + i)+j),相当于第i行第列的地址了;
" *((*(array + i))+j)", 如果继续再加上"*"号: *((*(array + i))+j),那么,这就相当于array[i][j]所存放的值了;
总体代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main()
{
int a[3][5];
int c[5]; //&c + 1;
int b[10]; //b代表数组首元素的地址 &b代表这个数组的地址 &b+1相当于指针后移4*10个单位
// 指针步长===>铁律1
//a的本质到底是代表什么呢? a是一个数组指针,指向低位数组的数组指针。
//因为不知道a的本质是什么,那么就看看a+1是什么就行了。
a + 1;
printf("a:%d, a+1:%d \n", a, a + 1);// 4*5
{
int i = 0, j = 0, tmp = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
a[i][j] = ++tmp;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d \n", a[i][j]);
}
}
}
{
int i = 0, j = 0;
int(*myArrayPoint)[5];
myArrayPoint = a;
for (i=0;i<3;i++)
{
for (j=0;j<5;j++)
{
//myArrayPoint[i][j] = ++tmp;
printf("%d \n", myArrayPoint[i][j]);
}
}
}
//a的本质就是一个指向c数组的一个指针,一个数组指针。每次往后跳一维的维数。。。。
printf("hello...\n");
system("pause");
return;
}