嵌入式科普(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;  
}

图片

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

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

相关文章

nestjs封装一个响应体

封装一个DTO // response.dto.tsimport {CallHandler,ExecutionContext,Injectable,NestInterceptor, } from "nestjs/common"; import { FastifyReply } from "fastify"; import { Observable } from "rxjs"; import { map } from "rxjs/…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷&#xff0c;网络是复杂的&#xff0c;需要建立复杂电力系统的同一潮流数学模型&#xff0c;借助计算机进行求解。 简介 …

浅谈音频鉴黄技术

随着互联网的迅猛发展和网络智能化的普及&#xff0c;音视频内容已成为互联网传播的主流形式&#xff0c;各大视频网站、直播平台及短视频应用不断涌现&#xff0c;为亿万用户提供了丰富多样的娱乐和资讯内容。然而&#xff0c;这种繁荣背后也隐藏着不容忽视的问题&#xff1a;…

如何申请免费一年SSL证书

申请免费一年的SSL证书可以通过以下几个步骤进行&#xff0c;这里以JoySSL为例&#xff0c;因为它是目前提供此类服务的流行平台之一&#xff0c;同时也提到了宝塔面板中的TrustAsia SSL证书。请根据您的具体需求选择合适的方式&#xff1a; 申请免费一年SSL证书&#xff1a; …

MIT 6.5840(6.824) Lab1:MapReduce 设计实现

1 介绍 本次实验是实现一个简易版本的MapReduce&#xff0c;你需要实现一个工作程序&#xff08;worker process&#xff09;和一个调度程序&#xff08;coordinator process&#xff09;。工作程序用来调用Map和Reduce函数&#xff0c;并处理文件的读取和写入。调度程序用来协…

游戏数值策划关卡策划文案策划系统策划及游戏运营干货

1.《游戏新手村》免费电子书 我2007年开始做网络游戏&#xff0c;后面又做过网页游戏和手机游戏。当时市面上关于游戏策划和运营的书籍屈指可数&#xff0c;于是我就想着要不我写一本吧&#xff0c;然后2014年10月开始撰写。关于本书的更多信息可查看这篇文章>> 游戏新手…

论Java和C++方向选择

目录 1.难度2.就业压力3.岗位选择4.薪资待遇5.选择建议小结 1.难度 Java &#xff0c;C&#xff0c; 测开&#xff0c;整体来说三个方向难度相当。 1.仅从语法角度来看&#xff0c;c 是掌控一切&#xff0c;知识都要懂一点&#xff0c;而java的特点在于省心&#xff0c;都封装…

Google如何做医疗大模型(Med-Gemini)

1. 前言 开发垂直领域模型的方法有好几种&#xff0c;其中医疗、法律等专业是比较能体现模型垂直行业能力的&#xff0c;因此也深受各大厂商的重视。 五一小长假的第一天&#xff0c;Google在Arxiv上发布了《Capabilities of Gemini Models in Medicine 》 ( https://arxiv.o…

大模型LLM 结合联网搜索增强isou

参考&#xff1a; https://github.com/yokingma/search_with_ai 在线使用网址&#xff1a; https://isou.chat/ 安装github下载&#xff0c;运行docker compose 如果一直报下面错误&#xff1a; 解决方法https://github.com/yokingma/search_with_ai/pull/7 默认打开&a…

nginx 发布静态资源

一. nginx 发布静态资源 在nginx中nginx.conf配置文件中添加内容如下&#xff1a; server {listen 90;server_name localhost;# 配置静态资源文件&#xff0c;就可以访问了location / {root /home/fooie-shop;index index.html;}# 配置音频和图片资源location /imoo…

NSSCTF | [SWPUCTF 2021 新生赛]babyrce

打开题目&#xff0c;显示了一个php脚本 我们来分析一下这个脚本是什么意思 <?php error_reporting(0); header("Content-Type:text/html;charsetutf-8"); highlight_file(__FILE__); if($_COOKIE[admin]1) {include "../next.php"; } elseecho &quo…

Java——多线程

一.多线程 1.什么是多线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程的实际运作单位 简单理解多线程就是应用软件中相互独立&#xff0c;可以同时运行的功能(也可以理解为人体内相互独立&#xff0c;但可以同时运行的器官⌓‿⌓) 我们…

排序-冒泡排序(bubble sort)

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…

[牛客网]——C语言刷题day2

答案&#xff1a;B 解析&#xff1a; char *p[10] 是指针数组,数组里存放了10个指针,在64位系统下指针占8个字节,所以sizeof(p) 10 * 8 80. char (*p1)[10]是数组指针,p1是一个指向存放10个char类型的数组的指针,所以sizeof(p1) 8. 答案&#xff1a;B 解析&#xff1a…

0513student的Maven项目

0513student的Maven项目包-CSDN博客 数据库字段 主页需求 点击休学按钮&#xff0c; 实现对 ‘’是否休学‘’ ‘’休学操作‘’ 的相应修改&#xff1b; 还有对数据库中相应学生休学状态修改。

11 | 如何实现高性能的异步网络传输?

理想的异步网络框架应该是什么样的? 这就是同步网络 IO 的模型。同步网络 IO 模型在处理少量连接的时候,是没有问题的。但是如果要同时处理非常多的连接,同步的网络 IO 模型就有点儿力不从心了。 因为,每个连接都需要阻塞一个线程来等待数据,大量的连接数就会需要相同数量…

vue3+TS或JS, 实现粒子特效 @tsparticles/vue3

在跟着B站视频BV11s4y1a71T学习时&#xff0c;使用到了粒子效果&#xff0c;但是以下这种情况只适用于项目是基于typescript的写法&#xff0c;否则无法实现。 粒子效果 VUE3TStsparticles/vue31、安装2、main.ts 引入3、App.vue4、效果 VUE3JS非最新版1、安装低版本的vue3-pa…

基于Java+SpringBoot+Vue前后端分离幼儿园管理系统设计与实现(有视频讲解)

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

git-删除workspace.xml的跟踪

问题描述 .gitignore 文件内容如下&#xff1a; .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

申请免费的必应搜索API

申请免费的必应搜索API 文章目录 申请免费的必应搜索API前言一、原理1.1 登录1.2 进入1.3 获取密钥1.4 申请VISA信用卡1.5 创建必应自定义搜索资源 二、创建成功 前言 准备条件&#xff1a; 1、outlook邮箱 2、招商银行全币种VISA信用卡【建议之前就有一张招商银行信用卡&…