C语言中的二维数组与指针

C语言中的二维数组与指针

这一块是很烦,但是理顺了之后就会简单很多。

数组存储本质

首先看下面一段代码:

int singleArray[4]={
   1,2,3,4};

image-20210403142039680

其在内存中的就是这样的存储形式,其中地址1代表的就是singleArray,其本质就是一个指针值,所以你采用*singleArray就能获得1

或者你还有可能见到这种写法*(singleArray+1),这样就能获得数组第二个的值,即2,这是因为地址2和地址3的值是连续的,两者之间的差值是1,为什么是1呢?这个需要结合数电的知识解释,这里你只需要知道,这里的本质是将其地址的值增加后获取新的地址的值即可。

数组与函数

下面就要结合函数来理解了,试问下面这两个函数有什么区别:

void inputPointer(int *array){
   
    //
}

void inputArray(int array[]){
   
    // 
}

答案:没有区别,都是告诉编译器,我会在这里传入一个数组,数组中的都是具体的值。


多维数组与指针:数组值为指针类型

再看下面两个函数,有什么区别:

// 这个上面见过
void inputPointer(int *array){
   
    //
}
// 重点是这个
void inputMultipleArray(int* *array){
   
  	//
}

看下面第二个函数,这里是在告诉编译器,我会在这个函数中传入一个数组,数组中的值为指针,这里有个有意思的点,什么叫数组中的值为指针呢?看下面这个例子:

int index1Array[]={
   1,2};
int index2Array[]={
   3,4};
int index3Array[]={
   5,6};
int* result[3];
result[0]=index1Array;
result[1]=index2Array;
result[2]=index3Array;

其中,这里的result[0]=index1Array;,根据前面的讲解,index1Array即代表的是数组的首地址,即指针的数据类型,而int* result[3]则是告诉编译器,我要申请3块连续的内存空间(数组的特性),用来存储int型的数组的地址,如果用具体的图表来表示就是:

image-20210403144522564

其中result即代表地址1

多维数组与指针:值为具体的值

上面是定义一个1维数组,然后在其中存储其他数组的地址以此来实现多维数组的形式,那么下面这种形式的多维数组,编译器是如何处理的呢?

int multipleArray[3][2]={
   
            {
   1,2},
            {
   3,4},
            {
   5,6}
    };

这个本质上还是一维数组,具体的存储形式如下:

image-20210403145143855

其中multipleArray即代表地址1。那么有个问题,既然是存储成一维数组的形式,那么当我输入multiple[1][2]的时候,编译器怎么知道去找哪里的值呢?

在解决这个问题之前,设想一下下面的数学关系:

image-20210403145816165

这里假设数组大小为[I][J],那么数组下标和内存块下标的换算关系是不是就是:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值