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


相关文章
|
9月前
|
存储 人工智能 编译器
【重学C++】【指针】一文看透:指针中容易混淆的四个概念、算数运算以及使用场景中容易忽视的细节
【重学C++】【指针】一文看透:指针中容易混淆的四个概念、算数运算以及使用场景中容易忽视的细节
127 1
|
9月前
|
存储 传感器 机器学习/深度学习
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
Java数组全套深入探究——进阶知识阶段6、三维数组以及更多维度数组的概念和用法
168 0
|
9月前
|
Java 数据处理 计算机视觉
Java数组全套深入探究——进阶知识阶段5、二维数组
Java数组全套深入探究——进阶知识阶段5、二维数组
87 0
|
9月前
|
存储 Java 程序员
Java数组全套深入探究——基础知识阶段1、数组的概述
Java数组全套深入探究——基础知识阶段1、数组的概述
66 0
|
9月前
|
存储 算法 Serverless
第六章:数组
第六章:数组
87 0
|
存储 缓存 调度
一文读懂循环队列的实现细节
一文读懂循环队列的实现细节
594 0
|
存储 编译器 C++
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
|
存储 算法 程序员
【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++
简单来说,数据结构是一种辅助程序设计并且进行优化的方法论,它不仅讨论数据的存储与处理的方法,同时也考虑到了数据彼此之间的关系与运算,从而极大程度的提高程序执行的效率,减少对内存空间的占用等。不同种类的数据结构适用于不同的程序应用,选择合适正确的数据结构,可以让算法发挥出更大的性能,给设计的程序带来更高效率的算法。
204 0
【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++
|
存储 算法 C++
【奇妙的数据结构世界】用图像和代码对堆栈的使用进行透彻学习 | C++
简单来说,数据结构是一种辅助程序设计并且进行优化的方法论,它不仅讨论数据的存储与处理的方法,同时也考虑到了数据彼此之间的关系与运算,从而极大程度的提高程序执行的效率,减少对内存空间的占用等。不同种类的数据结构适用于不同的程序应用,选择合适正确的数据结构,可以让算法发挥出更大的性能,给设计的程序带来更高效率的算法。
164 0
|
调度 C++
【C++初阶学习】C++类和对象-最终之章(下)(3)
【C++初阶学习】C++类和对象-最终之章(下)(3)
【C++初阶学习】C++类和对象-最终之章(下)(3)