文章目录
1 一维数组名
参考本人博客《C++数组》第2.2节一维数组的数组名。
1.1 一维数组名称的作用
(1)统计整个数组的长度,例:sizeof(arr) / sizeof(arr[0]);
数组占用内存空间大小:
sizeof(arr)
数组单个元素占用内存空间大小:sizeof(arr[0])
数组长度:sizeof(arr) / sizeof(arr[0])
(2)获取数组在内存中的首地址,例:arr。
获取数组首地址:
arr
或&arr[0]
。
注:
arr
或&arr[0]
:数组首元素的地址 ;
&arr
:整个数组的地址【地址值相同,含义不同】。
1.2 一维数组名的2种特例情况
一维数组名不表示数组首元素地址的两种特例:
①sizeof(数组名)
:整个数组的大小;
②&数组名
:整个数组的地址(地址值与首元素地址相同,但意义不同),表示数组指针。
注:其它情况下,一维数组的数组名均表示数组首元素地址,等价于相应的指针类型。
2 数组指针的定义方式
int arr[] = {1 , 2 , 3 , 4 , 5, 6};
一维数组的数组指针&arr
(一维数组取地址)的数据类型:int (*)[6]
2.1 typedef定义数组类型
先定义数组类型,再通过数组类型定义数组指针变量。
typedef int(ARRAY_TYPE)[6];
ARRAY_TYPE *arrP = &arr;
注:
ARRAY_TYPE
是存储6个int元素的数组类型。
2.2 typedef定义数组指针类型
先定义数组指针的类型,再通过数组指针类型定义数组指针变量。
typedef int(*ARRAY_POINTER_TYPE)[6];
ARRAY_POINTER_TYPE arrP = &arr;
2.3 直接定义数组指针变量
int (*arrP)[6] = &arr;
示例:通过数组指针访问数组元素
//*arrP等价于arr
for(int i = 0; i < 5; i++){
printf("%d\n", (*arrP)[i]); //[]的优先级高于*
//printf("%d\n", *((*arrP) + i)); //等价写法
}
3 二维数组名
3.1 二维数组名的作用
int arr[][3] = {{1,2,3},{4,5,6},[7,8,9]};
二维数组名arr
相当于指向第1个一维数组的数组指针(一维数组的数组指针),数据类型为int (*)[3]
。
//定义数组指针(一维数组的数组指针)
int (*pArray)[3] = arr;
//通过数组指针访问二维数组元素
printf("%d\n", arr[1][2]);
printf("%d\n", *(*(arr + 1) + 2));
printf("%d\n", *(*(pArray + 1) + 2));
//二维数组的本质是一维数组
//C语言中,二维数组的内存线性排列,按每行元素依次存储
printf("%d\n", *(*arr + 5));
3.2 二维数组名的2种特例情况
二维数组名不表示第1个一维数组的数组指针(一维数组的数组指针)的两种特例:
①sizeof(数组名)
:对二维数组名使用sizeof,表示整个数组的大小;
②&数组名
:对二维数组名取地址,表示的数据类型为数据类型:int (*)[3][3]
。
示例:
int arr[][3] = {{1,2,3},{4,5,6},[7,8,9]};
//对二维数组名取地址时,表示的数据类型为int (*)[3][3]
int (*p)[3][3] = &arr;
3.3 函数形参接收二维数组名的实参
(1)void func(int (*arr)[3], int row, int col)
(2)void func(int arr[3][3], int row, int col)
(3)void func(int arr[ ][3], int row, int col)
【不建议】