嵌入式科普(16)c语言函数参数的传递方式

目录

一、概述

二、C函数参数

2.1 一张图讲清

2.2 按数据类型分类:

2.2.1 基本数据类型参数:

2.2.2 数组参数:

2.2.3 结构体参数:

2.2.4 指针参数:

2.2.5 函数指针参数:

2.3 按传递方式分类:

2.3.1 值传递:

2.3.2 指针传递(或引用传递):

三、例程

3.1 值传递-副本的地址不同

3.2 结构体的传递效率

3.3 数组参数


嵌入式科普(16)c语言函数参数的传递方式

一、概述

  • c语言函数参数分类简介

  • 为【八、e2studio VS STM32CubeIDE之const修饰库函数形参】做铺垫

二、C函数参数

2.1 一张图讲清

图片

2.2 按数据类型分类:

2.2.1 基本数据类型参数:

int、char、float、double 等基本数据类型可以直接作为函数的参数。
特点:参数是通过值传递的,即函数接收到的是参数值的一个副本,对参数值的修改不会影响到原变量。

2.2.2 数组参数:

在C语言中,数组作为函数参数时通常会退化为指向数组首元素的指针。
特点:传递的是地址,而不是数组本身,因此在函数内部可以修改数组元素的值。通常还需要传递数组的大小作为另一个参数。

2.2.3 结构体参数:

结构体可以作为整体作为函数的参数。
特点:如果结构体较大,按值传递会导致较大的性能开销,因此通常选择传递结构体的指针。

2.2.4 指针参数:

指针本身可以作为函数的参数,用于传递变量的地址。
特点:通过指针参数,函数可以访问和修改原变量的值。

2.2.5 函数指针参数:

函数指针也可以作为函数的参数,用于实现回调函数等高级功能。
特点:允许将函数作为参数传递给另一个函数,增加了程序的灵活性和模块化。

2.3 按传递方式分类:

2.3.1 值传递:

默认情况下,C语言中的函数参数是通过值传递的。
特点:函数接收到的是参数值的一个副本,对参数值的修改不会影响到原变量。

2.3.2 指针传递(或引用传递):

通过传递指针或引用,函数可以访问和修改原变量的值。
特点:提高了函数的灵活性,但也需要额外注意内存管理和指针操作的正确性。

三、例程

3.1 值传递-副本的地址不同

#include <stdio.h>  // 这是一个函数,它接收一个整数作为参数(值传递)  
void printValueAndAddress(int value) {  printf("Inside function:\n");  printf("Value: %d\n", value);  printf("Address of value (local variable): %p\n", (void*)&value);  
}  int main() {  int a = 5;  printf("Before function call:\n");  printf("Value: %d\n", a);  printf("Address of a: %p\n", (void*)&a);  printValueAndAddress(a); // 传递的是a的副本  printf("After function call:\n");  printf("Value: %d\n", a);  printf("Address of a: %p\n", (void*)&a);  return 0;  
}
Before function call:  
Value: 5  
Address of a: 0x20001000  
Inside function:  
Value: 5  
Address of value (local variable): 0x20000ffc  
After function call:  
Value: 5  
Address of a: 0x20001000

3.2 结构体的传递效率

#include <stdio.h>  
#include <time.h>  typedef struct {  int data[1000];  
} LargeStruct;  // 这是一个函数,它接收指向结构体的指针(指针传递)  
void modifyStructByPointer(LargeStruct *structPtr) {  for (int i = 0; i < 1000; ++i) {  structPtr->data[i] = i;  }  
}  // 这是一个函数,它接收结构体的副本(值传递)  
void modifyStructByValue(LargeStruct structVal) {  for (int i = 0; i < 1000; ++i) {  structVal.data[i] = i;  }  // 注意:由于是值传递,这里的修改不会影响main中的原始结构体  
}  int main() {  clock_t start, end;  double cpu_time_used;  LargeStruct myStruct;  // 使用指针传递修改结构体  start = clock();  modifyStructByPointer(&myStruct);  end = clock();  cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;  printf("Time taken by pointer: %f seconds\n", cpu_time_used);  // 使用值传递(虽然这里的修改没有意义,但仅为了对比时间)  start = clock();  modifyStructByValue(myStruct); // 注意:这里的修改不会影响myStruct  end = clock();  cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;  printf("Time taken by value: %f seconds\n", cpu_time_used);  return 0;  
}

3.3 数组参数

#include <stdio.h>  // 函数声明中使用了数组类型,但实际上接收的是指向数组首元素的指针  
void printArray(int myArray[], int length) {  for (int i = 0; i < length; i++) {  printf("%d ", myArray[i]);  }  printf("\n");  
}  int main() {  int myArray[] = {1, 2, 3, 4, 5};  int length = sizeof(myArray) / sizeof(myArray[0]); // 计算数组长度  // 调用函数,传递数组和长度  printArray(myArray, length);  return 0;  
}

图片

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

具身触觉社区| “大咖面对面”第一期活动顺利举行

4月27日&#xff0c;由中国人工智能学会认知系统与信息处理专委会组织的“具身触觉社区”第一期“大咖面对面”分享活动顺利举行&#xff0c;我们邀请到了美国麻省理工学院&#xff08;MIT&#xff09;博士、视触觉传感器的奠基人、GelSight指尖传感器发明人李瑞老师为社区带来…

原生小程序开发如何使用 tailwindcss

原生小程序开发如何使用 tailwindcss 原生小程序开发如何使用 tailwindcss 前言什么是 weapp-tailwindcss ?0. 准备环境以及小程序项目1. 安装与配置 tailwindcss 0. 使用包管理器安装 tailwindcss1. 在项目目录下创建 postcss.config.js 并注册 tailwindcss2. 配置 tailwind…

SpringBoot项目的项目部署全过程

一、前端 安装nginx 1.将提前准备好的nginx的安装包上传到Linux中/opt目录下(我用的是Xftp) 2.解压 2.1:在xshell中解压该文件: tar -zxvf nginx-1.20.1.tar.gz 2.2:进入解压后的目录 cd nginx-1.20.1/ 2.3:安装需要的依赖 yum -y install zlib zlib-devel openssl openssl-de…

HTML特殊字符

特殊字符 有特殊含义的字符成为字符实体 对于有特殊含义的字符,需要通过转移字符来表示 <span> <br><a href"http://www.atguigu.com">我 爱 前端</a> <br>&amp;amp; 效果

【经验总结】超算互联网服务器 transformers 加载本地模型

1. 背景 使用 超算互联网 的云服务&#xff0c;不能连接外网&#xff0c;只能把模型下载到本地&#xff0c;再上传上去到云服务。 2. 模型下载 在 模型中 https://huggingface.co/models 找到所需的模型后 点击下载 config.json pytorch_model.bin vocab.txt 3. 上传模型文…

AcqKnowledge 5.0使用方法

Biopac 数据导入 matlab 处理方法 第一步&#xff1a;在 AcqKnowledge 软件中&#xff0c;将数据通道的 mark 信息导入到 Graph&#xff0c;并将数据存储为 acq3 的格式 第二步&#xff1a;MATLAB中读取acq3文件脚本 clc clear %%%所有被试这一层路径 pathsub fullfile(file…

PHP黑魔法之md5绕过

php本身是一种弱语言,这个特性决定了它的两个特点: 输入的参数都是当作字符串处理变量类型不需要声明,大部分时候都是通过函数进行类型转化php中的判断有两种: 松散比较:只需要值相同即可,类型不必相同,不通类型比较会先转化为同类型,比如全数字字符串和数字比较,会比…

【数据可视化01】matplotlib实例3之数据统计

目录 一、引言二、实例介绍1.百分位数为横条形图2.箱线图定制化3.带有自定义填充颜色的箱线图4.箱线图5.箱线图和小提琴图6.二维数据集的置信椭圆 一、引言 matplotlib库 可以用来创建各种静态、动态、交互式的图形&#xff0c;并广泛应用于数据分析和数据可视化领域。 二、实…

ip addr 或 ip address 是 Linux 系统中的一个命令,用于显示或修改网络接口的地址信息。

ip addr 或 ip address 是 Linux 系统中的一个命令&#xff0c;用于显示或修改网络接口的地址信息。这个命令是 iproute2 软件包的一部分&#xff0c;通常在现代 Linux 发行版中都是预装的。 当你运行 ip addr 或 ip address 命令时&#xff0c;你会看到系统上所有网络接口的地…

【C/C++笔试练习】DNS劫持、三次握手、TCP协议、HTTPS、四次挥手、HTTP报文、拥塞窗口、POP3协议、UDP协议、收件人列表、养兔子

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;DNS劫持&#xff08;2&#xff09;三次握手&#xff08;3&#xff09;TCP协议&#xff08;4&#xff09;HTTPS&#xff08;5&#xff09;四次挥手&#xff08;6&#xff09;HTTP报文&#xff08;7&#xff09;拥塞窗口&a…

软件工程期末复习(6)需求分析的任务

需求分析 需求分析的任务 “建造一个软件系统的最困难的部分是决定要建造什么……没有别的工作在做错时会如此影响最终系统&#xff0c;没有别的工作比以后矫正更困难。” —— Fred Brooks 需求难以建立的原因&#x…

C++ 关键字 :using

在 C 庞大语法体系中&#xff0c; using 关键字十分的灵活多用&#xff0c;它可不简单。 除了常规的引入命名空间之外&#xff0c;它还可用于引入枚举类型枚举器、定义常规类型别名、模板类型别名等。在定义常规类型别名方面与C语言中的typedef、#define与之相似&#xff0c;但…