C语言中的二维数组与指针
这一块是很烦,但是理顺了之后就会简单很多。
数组存储本质
首先看下面一段代码:
int singleArray[4]={
1,2,3,4};
其在内存中的就是这样的存储形式,其中地址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
型的数组的地址,如果用具体的图表来表示就是:
其中result
即代表地址1
。
多维数组与指针:值为具体的值
上面是定义一个1维数组,然后在其中存储其他数组的地址以此来实现多维数组的形式,那么下面这种形式的多维数组,编译器是如何处理的呢?
int multipleArray[3][2]={
{
1,2},
{
3,4},
{
5,6}
};
这个本质上还是一维数组,具体的存储形式如下:
其中multipleArray
即代表地址1
。那么有个问题,既然是存储成一维数组的形式,那么当我输入multiple[1][2]
的时候,编译器怎么知道去找哪里的值呢?
在解决这个问题之前,设想一下下面的数学关系:
这里假设数组大小为[I][J]
,那么数组下标和内存块下标的换算关系是不是就是: