C数组超细节精髓

简介: C数组超细节精髓

1.sizeof(数组名)与&数组名

在C语言中,一维数组名大多数情况等效于数组首元素地址。但有两个特例,sizeof(数组名)与&数组名。在这两个特例中数组名代表的是整个数组。

1. int arr[10]={1,2,3,4,5,6,7,8,9,10};
2. printf("%d",sizeof(arr));//4*10=40

我们知道数组名是首元素地址,所以可以用一个指针存放

1. int arr[10]={1,2,3,4,5,6,7,8,9,10};
2. int* p=arr;//存放首元素地址
3. //等价于int* p=&arr[0];

那么&数组名该存放到什么类型的指针呢?这里引出数组指针,是专门存放整个数组地址的一种指针。可以这样使用

1. int arr[3]={1,2,3};
2. int (*p)[3]=&arr;

2.一维数组传参

一维数组传参本质是传地址,但也可以直接在形参位置放同类型数组,例如

1. #include<stdio.h>
2. void print(int arr[3], int sz)
3. {
4. int i = 0;
5. for (i = 0; i < sz; i++)
6.     {
7. printf("%d ", arr[i]);
8.     }
9. 
10. }
11. int main()
12. {
13. int arr[3] = { 1,2,3 };
14. print(arr, 3);
15.   return 0;
16. }

这样可以很好的访问到一维数组。 下面也可以用指针来传参、访问

1. #include<stdio.h>
2. void print(int* arr, int sz)
3. {
4. int i = 0;
5. for (i = 0; i < sz; i++)
6.     {
7. printf("%d ", *(arr+i));
8.     }
9. 
10. }
11. int main()
12. {
13. int arr[3] = { 1,2,3 };
14. print(arr, 3);
15.   return 0;
16. }

这样就体现出了一维数组 数组名是首元素地址的问题了。

3.二维数组传参

二维数组传参也可以直接在形参位置放二维数组,例如

1. #include<stdio.h>
2. void print(int arr[3][4], int x, int y)
3. {
4.  int i = 0;
5.  int k = 0;
6.  for (i = 0; i < x; i++)
7.  {
8.    for (k = 0; k < y; k++)
9.    {
10.       printf("%d ", arr[i][k]);
11.     }
12.     printf("\n");
13.   }
14. }
15. int main()
16. {
17.   int arr[3][4] = { 1,2,3,4, 2,3,4,5, 3,4,5,6 };
18.   print(arr, 3, 4);
19.   return 0;
20. }

其实二维数组传参的本质是传数组指针。因为对于二维数组来说,数组名代表首行地址

 

数组维数 一维数组 二维数组
数组定义 int arr[] int arr[][]
数组名 arr arr
数组名等价 &arr[0] &arr[0]
含义 首元素地址 首行地址
int arr[3][4];

此时arr[0]代表的就是二维数组的第一行的地址,地址指向二维数组的第一行,是一种指针,即数组指针。

由此可知,二维数组传参的指针形式就是传一个数组指针,即形参是数组指针类型,代码如下

1. #include<stdio.h>
2. void print(int (*arr)[4], int x, int y)
3. {
4.  int i = 0;
5.  int k = 0;
6.  for (i = 0; i < x; i++)
7.  {
8.    for (k = 0; k < y; k++)
9.    {
10.       printf("%d ",*(*(arr+i))+k);
11.     }
12.     printf("\n");
13.   }
14. }
15. int main()
16. {
17.   int arr[3][4] = { 1,2,3,4, 2,3,4,5, 3,4,5,6 };
18.   print(arr, 3, 4);
19.   return 0;
20. }


相关文章
|
运维 Linux Windows
【计算巢】幻兽帕鲁服务器如何设置定时备份存档
计算巢针对幻兽帕鲁服务器,提供给了定时备份存档的功能,会在设定的频率下,定时将存档文件备份到目标文件夹下,有助于解决存档丢失和坏档的问题。
4416 1
|
程序员 C语言
C语言库函数 — 内存函数(含模拟实现内存函数)
C语言库函数 — 内存函数(含模拟实现内存函数)
240 0
|
C++
解决VS中的_CRT_SECURE_NO_WARNINGS 1的警告问题
解决VS中的_CRT_SECURE_NO_WARNINGS 1的警告问题
478 1
|
数据建模 大数据 数据库
【2023年4月美赛加赛】Y题:Understanding Used Sailboat Prices 建模思路、建模方案、数据来源、相关资料、Python代码
本文提供了2023年MCM问题Y的解题思路、建模方案、数据来源、相关资料以及Python代码,旨在建立数学模型解释二手帆船的挂牌价格,并分析地区对价格的影响,以及在香港(SAR)市场上的应用。
185 1
【2023年4月美赛加赛】Y题:Understanding Used Sailboat Prices 建模思路、建模方案、数据来源、相关资料、Python代码
|
存储 编译器 程序员
c语言基本数据类型详解
在 C 语言中,基本数据类型用于存储不同类型的数据,并在内存中分配不同大小的空间,如 `char`(1 字节)、`int`(4 字节)、`short`(2 字节)、`long`(4 或 8 字节)、`float`(4 字节)和 `double`(8 字节)。此外,还有 `void` 和用 `int` 类型替代的 `bool` 类型。这些数据类型的存储空间大小可能因编译器和平台的不同而有所变化,但通常遵循上述规则。选择合适的数据类型可以充分利用内存空间并确保数据准确性。C 语言还支持用户自定义数据类型,如结构体和枚举类型,用于描述复杂的数据结构。
|
Oracle 关系型数据库 MySQL
Flink CDC产品常见问题之用superset连接starrocks报错如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
算法 C语言
(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)
(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)
318 0
|
搜索推荐 算法
数据结构实验课:实验八、排序算法的实现
数据结构实验课:实验八、排序算法的实现
643 0
数据结构实验课:实验八、排序算法的实现
|
存储 C语言 索引
C语言进阶教程(数组指针和指针数组)
C语言进阶教程(数组指针和指针数组)
167 1
|
C语言
跳水运动员预测比赛结果排名次问题详解(逻辑类型题1)
跳水运动员预测比赛结果排名次问题详解(逻辑类型题1)
175 0