C语言的二维数组

一、一维数组

一维数组数组名在下面两种情况表示整个数组:

1.在定义数组的同一个函数中,求sizeof

2.在定义数组的同一个函数中,&arr+1

其他情况下表示数组首地址

二、二维数组

那既然一维数组数组名在一般情况下表示数组首地址,那二位数组数组名是不是也代表数组首地址?

二维数组本质上是以数组作为数组元素的数组,即“数组的数组”

由下面的源代码可以看出

#include <stdio.h>
 
int main() 
{
    int array[3][5] = {0};//定义一个二维数组(3行5列)
    int temp = 0;//设定一个临时的整型变量,用来给数组赋值
    for (int a = 0 ; a < 3; a++)//外层循环给数组的第一维赋值,就是array[x][y]的x
    {
        for (int b = 0 ; b < 5; b++)//内层循环给数组的第二维赋值,就是array[x][y]的y
        {
            temp = temp + 1;//为了让数组的数值不同,让临时变量有自增
            array[a][b] = temp;//二维数组的真正数据
            printf("array[%d][%d] = %-4d",a,b,array[a][b]);//打印出数组
        }
         printf("\n");//输出一行后换行
    }
    return 0;
}

输出为:


那二维数组可以和一维数组一样,像一维数组一样给函数传递数组名首地址吗?

答案是不能,因为一维数组只是数组,二维数组是数组的数组。

我们从下面可以看到

我们从左至右,从上至下讨论,

arr此时是一维数组数组名,即代表数组的首地址,也即是指针,变量类型int *

arr+1此时使用指针加法(可以看我指针的使用),变量类型int *

arr[0]此时为int型数据

brr此时是二维数组的数组名,即是数组的数组的首地址,也即是数组的指针,变量类型为int (*p)[4]

(brr是三个(长度为四的数组)的数组,所以类型为int (*p)[4],如果长度为五,则是int (*p)[5]

brr+1此时使用指针加法,变量类型int (*p)[4]

brr[0]此时可理解为一位数组的数组名,变量类型为int *

brr[0]+1此时使用指针加法,变量类型为int *

brr[0][0]此时为int型数据

三、注意区分数组指针与指针数组

数组的指针:指向数组(不是数组首地址)的指针

int (*p)[4]

指针的数组:存放指针的数组

int *p[4]

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页