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

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda