C语言:一维数组名、数组指针的定义方式、二维数组名

本文详细探讨了一维数组名的作用与特例,包括数组长度计算和地址获取,以及数组指针的不同定义方式。接着,重点讲解了二维数组名的用途、特例,并介绍如何在函数参数中传递二维数组。同时涵盖了数组和指针在C++中的实际操作和应用场景。
摘要由CSDN通过智能技术生成


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)【不建议】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值