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


相关文章
|
3月前
|
存储 C++
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
40 7
|
4月前
|
算法
二分查找算法的细节刨析 --适合有基础的朋友阅读
二分查找算法的细节刨析 --适合有基础的朋友阅读
|
4月前
|
存储 Java 程序员
Java数组全套深入探究——基础知识阶段1、数组的概述
Java数组全套深入探究——基础知识阶段1、数组的概述
40 0
|
存储 编译器 C++
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
|
编解码 缓存 NoSQL
7点 讲明白地图切片的概念与原理
7点 讲明白地图切片的概念与原理
436 0
|
测试技术
软件测试面试题:等待元素出现的这个方法如何实现的?
软件测试面试题:等待元素出现的这个方法如何实现的?
46 0
|
测试技术 程序员
编程中你注意过这些细节吗?
阅读本文大概需要3分钟。
220 0
编程中你注意过这些细节吗?
|
JavaScript 前端开发 网络架构
【重温基础】10.数组
【重温基础】10.数组
136 0
|
存储 Java 数据处理
升华数组-使用链表灵活整理数据 | 带你学《Java面向对象编程》之八十九
数组的存在的确便利了大量的数据处理,但其有一个严重的限制是长度必须固定。本节将带领读者“自定义”数据结构,使用链表达到和数组一样的效果。
升华数组-使用链表灵活整理数据 | 带你学《Java面向对象编程》之八十九
|
算法 Java DataX
数组算法进阶之探究转置之法 | 带你学《Java面向对象编程》之十九
本节列举了两个转置数组元素的方案,并辅以内存分析辨明两种方案的优劣,带领读者迅速掌握其中的算法思想。
数组算法进阶之探究转置之法   | 带你学《Java面向对象编程》之十九