欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

最后,输出显示: 

Record25—多维数组的本质

说明"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]所存放的值了;

Record25—多维数组的本质

总体代码

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

 

 

 

 

 

 

 

 

 

相关标签: C语言指针

上一篇: IO流-字节流

下一篇: Java中的IO流