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


相关文章
|
2月前
|
存储 搜索推荐 算法
Java数组全套深入探究——进阶知识阶段2、冒泡排序
Java数组全套深入探究——进阶知识阶段2、冒泡排序
52 0
|
2月前
|
存储 分布式计算 Java
深入探究JAVA编程语言:概念、应用与实例分析
**JAVA**是广泛应用的高级编程语言,以其易学性、跨平台能力和高效的性能著称。它采用面向对象编程,强调封装、继承和多态,且具备平台无关性、内置安全性和多线程支持。JAVA广泛应用于Web开发(如JSP、Servlet)、移动应用(Android开发)、大数据处理(Hadoop、Spark)和桌面应用。通过一个计算两数之和的简单示例,展示了JAVA的易读性和面向对象特性,帮助读者理解JAVA在实际开发中的运用。
|
2月前
|
算法
二分查找算法的细节刨析 --适合有基础的朋友阅读
二分查找算法的细节刨析 --适合有基础的朋友阅读
|
存储 编译器 C语言
【C】函数真的难嘛?其实一点也不难,原理很简单。
# 什么是函数 程序是由多个零件组合而成的,而函数就是这种“零件”的一个较小单位。 ## main函数和库函数 C语言程序中,main函数是必不可少的。程序运行的时候,会执行main函数的主题部分。main函数中使用了printf、scanf、puts等函数。由C语言提供的这些为数众多的函数称为库函数。 ## 什么是函数 当然,我们也可以自己创建函数。而实际上,我们也必须亲自动手创建各种函数。下面我们来自己创建一个简单的函数。 创建一个函数,接收两个整数参数,返回较大整数的值。 printf函数和scanf函数等创建得比较好得函数,即使不知道其内容,只要了解使用方法,也可以轻松使用。 ## 函
|
存储 编译器 C++
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
【C++】list迭代器的深度剖析及模拟实现(感受类封装,类和对象的思想)
|
编解码 缓存 NoSQL
7点 讲明白地图切片的概念与原理
7点 讲明白地图切片的概念与原理
373 0
|
算法 编译器 C语言
【STL算法】for_each源码刨析及函数对象本质刨析
【STL算法】for_each源码刨析及函数对象本质刨析
133 0
【STL算法】for_each源码刨析及函数对象本质刨析
|
测试技术 程序员
编程中你注意过这些细节吗?
阅读本文大概需要3分钟。
201 0
编程中你注意过这些细节吗?
|
JavaScript 前端开发 网络架构
【重温基础】10.数组
【重温基础】10.数组
129 0
|
存储 算法
谈谈动态规划的本质
今天这篇文章,让我们深入动态规划,一窥动态规划的本质。
167 0

热门文章

最新文章