【C语言 | 指针】数组参数 和 指针参数

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍C语言的数组参数 和 指针参数🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、一维数组参数
    • ✨2.1 一维数组形参
    • ✨2.2 一维数组实参
  • 🎄三、一级指针参数
    • ✨3.1 一级指针形参
    • ✨3.2 一级指针实参
  • 🎄四
  • 🎄五
  • 🎄六、


在这里插入图片描述

🎄一、概述

在使用函数时,参数分为形参和实参。
形参是指声明或定义函数时的参数;
实参是在调用函数时主调函数传递过来的实际值。

本文主要介绍C语言中函数参数为数组或者指针时,一些容易令人混淆的概念。在继续学习之前不妨思考一下几个问题:
1.数组可以作为函数形参吗?
2.数组可以作为函数实参吗?
3.指针作为函数参数,需要注意什么?


在这里插入图片描述

🎄二、一维数组参数

学习数组参数前,先看下面代码是否有问题:
这里fun函数的形参看起来应该是一个包含10个char型的数组,然后在调用fun函数时,把数组b作为实参传入函数。
可事实并不是这样的,接着往下看。

void fun(char a[10])
{
	char c = a[3];
}
int main()
{
	char b[10] = "abcdefg";
	fun(b[10]);
	return 0;
}

事实上,上面代码编译后,会产生一个警告和一个注意,编译打印:
在这里插入图片描述
这个warning说,调用fun(b[10])时,传入的指针来自不带强制转换的整型数。意思是,编译器把b[10]当前一个整型数,并且调用fun(b[10])时,会将b[10]转换成指针。
这里的note,提示我们void fun(char a[10])需要一个char*的实参,但给的却是char

从这个例子,我们可以清楚下面几点:
1、调用fun(b[10]);时,b[10]并不是一个数组,而是b数组的一个元素,类型是char;
2、编译器并不管b[10]是否越界,只是把它当前一个数组元素;
3、void fun(char a[10])需要的参数是一个char *指针。
4、C语言中,无法将一个数组直接传递给函数。

✨2.1 一维数组形参

C语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。

编译器这么做是有原因的。在 C 语言中,所有非数组形式的数据实参均以传值形式(对实参做一份拷贝并传递给被调用的函数,函数不能修改作为实参的实际变量的值,而只能修改传递给它的那份拷贝)调用。然而,如果要拷贝整个数组,无论在空间上还是在时间上,其开销都是非常大的。更重要的是,在绝大部分情况下,你其实并不需要整个数组的拷贝,你只想告诉函数在那一刻对哪个特定的数组感兴趣。这样的话,为了节省时间和空间,提高程序运行的效率,于是就有了上述的规则。同样的,函数的返回值也不能是一个数组,而只能是指针。

看下面例子,在fun函数中,打印形参的a的大小,发现等于指针大小sizeof(int*)。

#include <stdio.h>
void fun(int a[10])
{
	printf("a=%p sizeof(a)=%lu\n", a, sizeof(a));
}
int main()
{
	int a[10] = {1,2,3,4,5,6,7,8,9,0};
	printf("a=%p sizeof(int*)=%lu\n", a, sizeof(int*));
	fun(a);
	return 0;
}

既然跟数组大小无关的话,fun函数可以写成下面的形式:

void fun(int a[])
{
	printf("a=%p sizeof(a)=%lu\n", a, sizeof(a));
}

因为编译器把它当成指针,所以我们也可以直接把fun函数形参写成指针,如下:

void fun(int *a)
{
	printf("a=%p sizeof(a)=%lu\n", a, sizeof(a));
}

所以,数组形参的这三种写法都是一样的:

1void fun(int a[10])
2void fun(int a[])
3void fun(int *a)

✨2.2 一维数组实参

由前一小节,应该可以很清楚知道,无法向函数传递一个数组。所以就没有数组实参的说法。

那么,将数组名作为实参传给函数,又是什么意思呢?

其实,数组名就是数组首个元素的地址,是一个指针,数组形参的本质也是一个指针,将数组名作为实参传给函数,实际上就是将一个指针赋值给另一个指针,是符合C语言规定的。


在这里插入图片描述

🎄三、一级指针参数

✨3.1 一级指针形参

形参是对实参的一份拷贝(复制),并不是实参本身。对于指针参数,也是如此,所以无法将指针本身传递给函数。

#include <stdio.h>
void fun(int *p2)
{
	printf("&p2=%p p2=&p\n", &p2, p2);
}
int main()
{
	int i=10;
	int *p = &i;
	printf("a=%p sizeof(int*)=%lu\n", a, sizeof(int*));
	fun(a);
	return 0;
}

✨3.2 一级指针实参

想要改变指针实参的值,可以传入二级指针,也可以将指针修改后并返回该指针。
在这里插入图片描述

🎄四

在这里插入图片描述

🎄五

在这里插入图片描述

🎄六、

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/240535.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA利用插件完成properties与yml的互相转换(mac与wins通用)

步骤一、插件安装 点击屏幕左上方的IDEA&#xff0c;然后点击Preferences(相当于wins里的settings) 进入后点击Plugins&#xff0c;在插件商城中搜索并安装 Convert YAML and Properties File 这个插件 二、使用 右键选择你需要转换的配置文件&#xff0c;选择Convert YAML …

解决高风险代码:Mass Assignment: Insecure Binder Configuration

Abstract 用于将 HTTP 请求参数绑定到模型类的框架绑定器未显式配置为允许或禁止特定属性 Explanation 为便于开发和提高生产率&#xff0c;现代框架允许自动实例化一个对象&#xff0c;并使用名称与要绑定的类的属性相匹配的 HTTP 请求参数填充该对象。对象的自动实例化和填充…

安装Anaconda和pytorch

首先看下自己电脑是否有英伟达的显卡&#xff0c;如果有的话可以安装GPU版本&#xff0c;没有的话可以安装CPU版本。 CPU版本 1.安装Anaconda 首先去官网下载Anaconda。 点击download&#xff0c;下载的就是最新版本的。 下载完成后&#xff0c;直接运行下步就行 注意到路径…

Chrome更新

Chrome无法通过360软件管家升级&#xff0c;最方便的升级方法应该是通过Chrome本身进行升级&#xff0c;但可能需要自备梯子。 点击Chrome右上角三个点 点击帮助 点击关于Google Chrome 在弹出的页面中查看是否是最新版本&#xff0c;如果不是最新版本会有一个升级的按钮&a…

开题PPT答辩复盘

目录 总体思路加粗和红体字使用研究现状之后主要研究内容讨论 总体思路 分为五个部分&#xff0c;规定在10分钟以内讲完。这次开题答辩&#xff0c;主要是要讲清楚研究背景和意义&#xff0c;国内外研究现状。因此前两部分需要花大概6分钟重点解释&#xff0c;主要研究内容用2…

【Linux】进程周边003之进程优先级

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.基本概念 2.PRI与NI 3.利…

使用护眼台灯能不能有效预防近视?分享高品质的护眼台灯

在近几年&#xff0c;儿童青少年近视率非常高。很多家长认为孩子近视的原因是没有养成正确的用眼习惯&#xff0c;例如经常趴桌子写作业、眯眼看书等&#xff0c;但实际上这些坏习惯是因为没有合适的光线而导致的。所以安排一盏合适的台灯给孩子学习是非常重要的。 目前而言最好…

图片压缩软件4K Image Compressor Pro mac特点介绍

4K Image Compressor Pro mac是一款专业的图片压缩软件&#xff0c;它可以在不损失图像质量的前提下&#xff0c;优化图片文件的大小&#xff0c;从而节省存储空间&#xff0c;方便在社交媒体上共享图片&#xff0c;并优化网站加载速度。 4K Image Compressor Pro mac软件特点 …

29、Windows安全配置

文章目录 一、Windows安全配置简介二、账户策略2.1 密码策略2.2 账户锁定策略 三、本地策略3.1 用户权限分配 四、安全设置4.1 账户4.2 审核4.3 设备4.4交互式登录4.5 网络访问4.6 网络安全4.7 用户账户控制4.8 防火墙配置 五、高级审核策略设置5.1 账户登录5.2 账户管理5.3 对…

MDM主数据平台如何实现质量管控

当企业业务以及信息化建设发展到一定阶段后&#xff0c;都不可避免地要进行信息化和数据的治理工作&#xff0c;而主数据治理则是数据治理的基础。随着信息系统和业务的增加&#xff0c;系统打通与数据集成共享必然会成为企业信息化建设的瓶颈&#xff0c;而要实现系统集成&…

怪兽吃糖果

欢迎来到程序小院 怪兽吃糖果 玩法&#xff1a;左右飞出的糖果&#xff0c;点击鼠标糖果即为怪兽吃掉&#xff0c;不同的糖果不同的分数奖励&#xff0c; 吃不掉的糖果会扣除一次生命&#xff0c;共三次生命值&#xff0c;点击炸弹游戏结束&#xff0c;快去吃糖果吧^^开始游戏…

Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

项目运行运行录屏&#xff1a; Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏 完整代码下载地址&#xff1a;Pyhon基于YOLOV实现的车辆品牌及型号检测项目 项目背景&#xff1a; 车辆检测及型号识别广泛应用于物业&#xff0c;交通等的管理场景中。通过在停车场出入口…

在Spring Cloud中实现Feign声明式服务调用客户端

如果你学过Spring Cloud&#xff0c;你应该知道我们可以通过OpenFeign从一个服务中调用另一个服务&#xff0c;我们一般采用的方式就是定义一个Feign接口并使用FeignClient注解来进行标注&#xff0c;feign会默认为我们创建的接口生成一个代理对象。 当我们在代码中调用Feign接…

Leetcode143 重排链表

重排链表 题解1 线性表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值&#xff0c;而是需要实际…

【Week P1】 MNIST手写数字识别

文章目录 一、环境配置1.1 安装环境1.2 设置环境&#xff0c;开始本文内容 二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结2.1 ⭐ torchvision.datasets.MNIST详解(Line4 & Line9)2.2 ⭐ torch.utils.data.DataLoader详解(Line4 & Line9)2.3 ⭐ sq…

C类核心论文复现:基于电力系统碳排放流理论的碳排放分摊模型研究程序代码!

本程序参考中文核心论文《基于电力系统碳排放流理论的碳排放分摊模型研究》&#xff0c;文中运用潮流追踪对系统网损引起的碳排放进行分配定量&#xff0c;最后得到系统实时碳排放的产权分配结果&#xff0c;程序较为简单和基础&#xff0c;具有较强的可扩展性和适用性&#xf…

路由器静态路由的配置

路由器静态路由的配置步骤如下&#xff1a; 进入系统视图。输入命令sys进入系统视图。配置路由器的接口IP地址。命令格式为int g0/0/0&#xff0c;其中g0/0/0表示路由器的接口&#xff0c;可以根据实际情况进行修改。然后使用命令ip add配置接口的IP地址。配置下一跳地址。在静…

【IDEA】IntelliJ IDEA创建一个Maven项目

在IDEA中创建Maven项目&#xff0c;前提是已经安装配置好Maven环境 。 本文主要使用的是IntelliJ IDEA 2022.2.1 (Community Edition) 1.创建一个新project:File>Project 2.修改Maven配置&#xff1a;File>Settings>搜索maven 创建好的工程如下&#xff1a; src/main…

应用在MiniLED电视领域中的MiniLED背光技术

众所周知&#xff0c;液晶技术发展至今仍旧无法避免自身的一些短板。随着消费升级等因素的影响&#xff0c;大家对于电视画质层面有了更高的需求与期待。所以在近的几年里&#xff0c;大厂们都在寻求能够替代LCD液晶的更优秀的显示技术。这其中&#xff0c;Mini LED势头惊人&am…

音乐制作软件Studio One mac软件特点

Studio One mac是一款专业的音乐制作软件&#xff0c;由美国PreSonus公司开发。该软件提供了全面的音频编辑和混音功能&#xff0c;包括录制、编曲、合成、采样等多种工具&#xff0c;可用于制作各种类型的音乐&#xff0c;如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件…