数组类型和多维数组本质-3:多维数组的技术推演

定义一个数组:int  a[3][5];

//给数组赋值

int i=0,j=0, tmp=1;

for (i=0;i<3;i++)

{

for(j=0;j<5;j++)

    {

        a[i][j]=tmp++;

    }

}

//打印数组:

int i=0,j=0;

for (i=0;i<3;i++)

{

    for(j=0;j<5;j++)

    {

        printf("%d  ", a[i][j]);

    }

}

//多维数组名代表了什么?打印多维数组名地址:

printf("a: %d, a+1: %d \n", a, a+1); //a+1往后跳了5个int型字节大小(20个字节)因此a指向一维数组,即a和一个指向一维数组的指针等价

printf("&a: %d, &a+1: %d \n", &a, &a+1); 

// //a+1往后跳了20个字节,步长是5个元素。因此a指向一维数组,即a和一个指向一维数组的指针等价。&a+1步长为60个字节。

多维数组名的本质是一个数组指针。


int (*parray)[5];   //定义一个指向数组的指针

parray=a; // a是指向一维数组的二级指针,p是二级指针,可以将a赋值给parray。

//a+i,parray+i代表整个第i行数组地址,加一个星号*代表第i行首元素地址*(a+i),加j后,代表第i行的第j个元素的地址。

//中括号到括号的技术推演:中括号的运算顺序:从左至右。i加占位符0;0换成a,中括号变括号,同时括号前加星号

//a[i][j]  ==> a[0+i][j] ==> *(a+i)[j] ==> *(a+i)[0+j] ==> *(*(a+i)+j)

//多维数组做函数参数,存在退化问题

//以下三种函数形参写法等价:

void printArray(int a[3][5])

void printArray(int a[][5])//a的本质是指向一维数组的指针,故第一维可以省略

void printArray(int (*a)[5]) //定义一个数组指针类型a

{

int i,j;

for(i=0;i<3;i++)

{

for(j=0;j<5;j++)

{

printf("%d  ", a[i][j]);

}

}

}


可以证明,多维数组是线性存储的。证明思路:可以把二维数组当一维数组打印。若要证明,可以把数组按照一维数组打印的方法打印多维数组的值,一维数组的长度即多维数组长度的总的元素之后

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,771评论 0 2
  • 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称...
    朱森阅读 9,550评论 2 13
  • 一、框架 1、Mac系统及常用工具、进制;C数据类型、常量变量、运算符、表达式、格式化输入输出 2、关系运算符、逻...
    师景福阅读 4,055评论 0 2
  • 前言:指针是 C语言一个重要概念,也是C 语言的一个重要特色。使程序简洁、紧凑、高效。指针乃是C之精华。 数据在内...
    潇湘候晨雪阅读 4,127评论 0 0
  • https://blog.csdn.net/Yuzopro/article/details/96001295
    kkgo阅读 1,092评论 0 0