3.10.输入型参数与输出型参数

2024-09-05 12:28
文章标签 输出 参数 输入 3.10

本文主要是介绍3.10.输入型参数与输出型参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

指针才是C的精髓

  • 3.10.输入型参数与输出型参数
    • 3.10.1、函数为什么需要形参与返回值
    • 3.10.2、函数传参中使用const指针
    • 3.10.3、函数需要向外部返回多个值时怎么办?
    • 3.10.4、总结

3.10.输入型参数与输出型参数

3.10.1、函数为什么需要形参与返回值

(1)函数名是一个符号,表示整个函数代码段的首地址,实质是一个指针常量,所以在程序中使用到函数名时都是当地址用的,用来调用这个函数的。
(2)函数体是函数的关键,由一对{}括起来,包含很多句代码,函数体就是函数实际做的工作。
(3)形参列表和返回值。形参是函数的输入部分,返回值是函数的输出部分。对函数最好的理解就是把函数看成是一个加工机器(程序其实就是数据加工器),形参列表就是这个机器的原材料输入端;而返回值就是机器的成品输出端。
(4)其实如果没有形参列表和返回值,函数也能对数据进行加工,用全局变量即可。用全局变量来传参和用函数参数列表返回值来传参各有特点,在实践中都有使用。总的来说,函数参数传参用的比较多,因为这样可以实现模块化编程,而C语言中也是尽量减少使用全局变量。

#include<stdio.h>int x = 0; //被乘5的变量,也就是输入函数的变量
int y = 0; //输出结果的变量int multip5(int a);
void multip5_2(void);int main(void)
{//程序要完成的功能是:对一个数乘以5//方法1:函数传参int a = 3;int b = 0;b = multip5(a);printf("b = %d\n", b);//方法2:用全局变量来传参x = 2;multip5_2();printf("y = %d\n", y);return 0;
}int multip5(int a)
{return a * 5;
}void multip5_2(void)
{y = 5 * x;
}

(5)全局变量传参最大的好处就是省略了函数传参的开销,所以效率要高一些;但是实战中用的最多的还是传参,如果参数很多传参开销非常大,通常的做法是把很多参数打包成一个结构体,然后传结构体变量指针进去。

3.10.2、函数传参中使用const指针

(1)const一般用在函数参数列表中,用法是const int *p;(意义是指针变量p本身可变的,而p所指向的变量是不可变的)。

#include <stdio.h>void func1(int *p)
{*p = 5;
}void func2(const int *p) //p指向的变量不可改变
{//*p = 5; //error: assignment of read-only location ‘*p’
}int main(void)
{int a = 1;func1(&a);func2(&a);return 0;
}

(2)const用来修饰指针做函数传参,作用就在于声明在函数内部不会改变这个指针所指向的内容,所以给该函数传一个不可改变的指针(char *p = "linux";这种)不会触发错误;而一个未声明为const的指针的函数,你给他传一个不可更改的指针的时候就要小心了。

#include <stdio.h>void func3(char *p)
{*p = 'a';
}void func3_1(const char *p)
{*p = 'a';
}void func4(char *p)
{*p = 'a';
}int main(void)
{char *pStr = "linux";char Str[] = "linux";// func3(pStr); //可编译通过,运行出现段错误// printf("pStr = %s\n", pStr);//解决方法:把func函数入参声明成const,编译器可检查出来错误func3_1(pStr);printf("pStr = %s\n", pStr);func4(Str);printf("Str = %s\n", Str); //结果为ainuxreturn 0;
}

3.10.3、函数需要向外部返回多个值时怎么办?

(1)一般来说,函数的输入部分就是函数参数,输出部分就是返回值。问题是函数的参数可以有很多个,而返回值只能有1个。这就造成我们无法让一个函数返回多个值。
(2)现实编程中,一个函数需要返回多个值是非常普遍的,因此完全依赖于返回值是不靠谱的,通常的做法是用参数来做返回(在典型的linux风格函数中,返回值是不用来返回结果的,而是用来返回0或者负数用来表示程序执行结果是对还是错,是成功还是失败)。
(3)普遍做法,编程中函数的输入和输出都是靠函数参数的(函数入参),返回值只是用来表示函数执行的结果是对(成功)还是错(失败)。如果这个参数是用来做输入的,就叫输入型参数;如果这个参数的目的是用来做输出的,就叫输出型参数。

#include <stdio.h>int func1(int a, int *p)
{int result = 0;result = 5 * a;if(result < 100){return -1;}else{*p = result;return 0;}
}int main(void)
{//在linux编程应用里最常规常用的一种编程方法int x = 0;int y = 0;int ret = -1;// x = 30;x = 3;ret = func1(x, &y); //x叫输入型参数,y叫输出型参数if(-1 == ret){printf("func1 error, y < 100.\n");return -1;}printf("y = %d\n", y);return 0;
}

(4)输出型参数就是用来让函数内部把数据输出到函数外部的。

3.10.4、总结

(1)看到一个函数的原型后,怎么样一眼看出来哪个参数做输入哪个做输出?函数传参如果传的是普通变量(不是指针)那肯定是输入型参数;如果传指针就有2种可能性了,为了区别,经常的做法是:
①如果这个参数是做输入的(通常做输入的在函数内部只需要读取这个参数而不会需要更改它)就在指针前面加const来修饰;
②如果函数形参是指针变量并且还没加const,那么就表示这个参数是用来做输出型参数的。
③譬如C库函数中strcpy函数

char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

返回:C语言指针系列目录

这篇关于3.10.输入型参数与输出型参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

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

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

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

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

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

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

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

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析