C语言从头学23——参数的传值与传址引用

2024-06-19 22:12

本文主要是介绍C语言从头学23——参数的传值与传址引用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在前面学习函数时,曾学习过函数的参数。函数的参数可以是具体的值,也可以是变量。当函数的参数是变量时,就涉及到参数如何传递到函数中。一般有两种方式:传值引用方式、传址引用方式。
      一、传值引用:函数的参数以变量方式传入函数时,实际传入的是这个变量的值拷贝,而不是变量本身。这种使用参数的方式称为传值引用。举例看一下:

#include<stdio.h>
void func (int x)
{x = 2 * x; //将传入的x做乘以2运算后再赋值给xprintf("func函数中x=%d\n", x);//将经过函数计算的x显示到屏幕上。运行结果:func函数中x=10
}
int main(void)
{int x = 5;func(x); //将参数x传入func函数printf("主函数中x=%d\n", x); //运行结果:主函数中x=5getchar();return 0;
}

       从子函数 func 函数的运行结果看,x已在子函数中被乘以2变成了10;但我们从主函数调用func完毕后的位置看 x 的值,仍然是开始的5而不是10。这说明,x以变量方式传入函数func后,无论经过怎样的计算,都不会影响到x原来的值。相当于是 x 找了一个替身(拷贝)把值 5 传入了函数func,自己仍躲在外边没到函数中去。
       从上面的内容看传值方式的好处是,不管有多少函数使用某一变量的值进行运算,都不会影响到变量的原值。但有时,我们就希望把传入的参数的值给改一下,怎么做呢?可以把 func 函数给改一下,无返回值的 void 类型改成有返回值的 int 类型,然后用 x 接收函数的返回值,这样 x 的值就改变了(举例略)。但一个函数的返回值只能有一个,如果有多个参数需要改变时,就不好办了,怎么办呢好呢?这就引出下一种参数传递方式。
      二、传址引用:通过传入变量的地址,函数内部就可以直接操作该地址,该地址存储的值进而改变。表面上看,只是通过传参将变量地址传入函数,并没有通过返回值将参数返回,但客观上原参数变量的值确实被改变了。举例如下:

#include<stdio.h>
void func1 (int* x,int* y) //以传址方式传参的无返回值函数
{// 以上三个语句将x、y的值进行了交换int temp = *x;*x = *y;*y = temp;//将经过函数计算的x、y显示到屏幕上printf("func1运行中:*x=%d,*y=%d\n", *x,*y);
}
int main(void)
{int a = 5,b=10; //记住两个变量a和b的原值printf("func1运行前:原参数a=%d,b=%d\n", a, b);int* x = &a; //把a的地址赋给xint* y = &b; //把b的地址赋给yfunc1(x,y); //运行函数func1并把a、b的地址作为参数传到函数中printf("func1运行后:原参数a=%d,b=%d\n", a, b);getchar();return 0;
}

运行结果:
       func1运行前:原参数a=5,b=10
       func1运行中:*x=10,*y=5
       func1运行后:原参数a=10,b=5
      上面程序的将原始的变量a、b的地址作为参数传入func1函数,函数运行将两个地址上的值进行了交换,函数运行后,我们发现a、b的值进行了交换。这就是参数变量传址方式的结果。
      总结:如只需要利用参数变量的值进行计算后输出一个结果,就利用传值方式传递参数;如需要把参数变量的值进行改变并在其它地方使用这些值,使用传址方式传递参数为佳;传值、传址两种方式结合起来效果更好。
      另外,如果声明一个返回值为指针类型的函数,要注意返回指针变量的作用域。如在函数内部声明的指针,传到函数外时,由于函数运行已经结束,占用的地址空间都被系统收回了,这时再使用那个指针肯定要出错。(可以使用全局指针变量)

这篇关于C语言从头学23——参数的传值与传址引用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076287

相关文章

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX