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. }


相关文章
|
1月前
|
存储 安全 JavaScript
Java泛型的一些细节
泛型的核心思想是将类型参数化,主要目的是提供类型安全和消除类型转换,使代码更加健壮和可读。泛型在编译阶段起作用,允许在定义类、接口、方法和属性时使用类型参数。泛型的优点包括集合中存储的元素类型统一,减少类型转换;缺点是集合中元素缺乏多样性。泛型的主要作用是确保数据安全和防止类型转换错误。常见的泛型通配符包括无界通配符 `&lt;?&gt;`、上界通配符 `&lt;? extends T&gt;` 和下界通配符 `&lt;? super T&gt;`,分别用于不同场景下的类型匹配。
|
自然语言处理 Java 机器人
从细节出发:提高你的代码可读性
在编程的世界中,我们总是不断追求更高的性能,更优雅的设计,以及更复杂的特性。然而,我们不应忽视一个基本且重要的原则——代码的可读性。那么究竟何谓代码的可读性?顾名思义,代码可读性是指代码可理解的程度,是代码作者通过代码这个媒介,将需要表达的信息输出到读者脑中的能力。所以有的人说好的代码必然有清晰完整的注释,也有人说代码即注释,是代码简洁之道的最高境界,后者的观点飞哥持保留意见,毕竟真正能够做到代码即注释的有几人呢?
|
7月前
|
C++
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
【C++】一文深入浅出带你参透库中的几种 [ 智能指针 ]及其背后实现原理(代码&图示)
|
7月前
|
算法
二分查找算法的细节刨析 --适合有基础的朋友阅读
二分查找算法的细节刨析 --适合有基础的朋友阅读
|
7月前
|
存储 Java 程序员
Java数组全套深入探究——基础知识阶段1、数组的概述
Java数组全套深入探究——基础知识阶段1、数组的概述
59 0
|
7月前
|
存储 传感器 机器学习/深度学习
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
133 0
|
JSON 前端开发 Java
《优化接口设计的思路》系列:第一篇—接口参数的一些弯弯绕绕
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。
80 0
|
存储 缓存 调度
一文读懂循环队列的实现细节
一文读懂循环队列的实现细节
558 0
|
存储 编译器 C++
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
|
存储 算法 程序员
【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++
简单来说,数据结构是一种辅助程序设计并且进行优化的方法论,它不仅讨论数据的存储与处理的方法,同时也考虑到了数据彼此之间的关系与运算,从而极大程度的提高程序执行的效率,减少对内存空间的占用等。不同种类的数据结构适用于不同的程序应用,选择合适正确的数据结构,可以让算法发挥出更大的性能,给设计的程序带来更高效率的算法。
192 0
【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++