一、一维数组
一维数组数组名在下面两种情况表示整个数组:
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]