首页 > 其他分享 >C和指针:函数

C和指针:函数

时间:2024-09-25 11:52:54浏览次数:10  
标签:va 函数 int list 列表 参数 指针


函数定义

函数体就是一个代码块,它在函数被调用时执行。

类型
函数名(形式参数)
代码块

与函数定义相反,函数声明出现在函数被调用的地方。

函数声明

编译器是如何知道该函数期望接受的是什么类型和多少数量的参数。

原型
int *find_int( int key, int array[1, int len);

原型告诉编译器函数的参数数量和每个参数的类型以及返回值的类型。

编译器见过原型之后,就可以检查该函数的调用,确保参数正确、返回值无误。

C 语言编程中,最好函数原型声明放在头文件中,通过 #include 指令将其包含到多个源文件中,

(1)减少代码冗余,如果每个地方都手动输入函数原型,可能会导致不同地方的原型不一致,进而导致编译错误或运行时错误。

(2)修改方便。当函数的定义发生变化时,如果原型分散在各个地方,则需要在所有地方进行相应的修改,这既耗时又容易出错。将函数原型放在头文件时,函数需要修改,只需在一个地方进行修改,然后重新编译所有引用了该原型的文件。

函数的参数

C 函数的所有参数以"传值调用"方式进行传递,函数将获得参数值的一份拷贝,函数修改这个拷贝值,不会修改调用程序实际传递给它的参数。

如果传入数组,相当于传入一个指针,可以直接修改数组的元素。数组名的值实际上是一个指针,传递给函数的就是这个指针的一份拷贝。下标引用 实际上是 间接访问的另一种形式,可以对指针执行间接访问操作,访问指针指向的内存位置,参数(指针)实际上是一份拷贝,但在这份拷贝上执行间接访问操作所访问的是原先的数组。

ADT和黑盒

C可以使用static限制函数和数据的作用域(黑盒设计)。在设计模块的时候,隐藏的细节比如函数和数据结构如果不想让其他模块访问,可以加上static关键字。使用模块的用户不需要知道模块实现的任何细节,只能访问模块提供的接口。

递归

C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。但是在简单的任务钟,递归的效率不如迭代。比如斐波拉契数列最好使用for循环实现。

可变参数列表

函数可以接受一个不定长的参数列表

stdarg 宏

va_list: 一个类型,用来存储可变参数列表的信息。

va_start: 宏va_start用于初始化 va_list 类型的变量,它接受两个参数:第一个是要初始化的 va_list 类型的变量;第二个是省略号前的最后一个固定参数。

va_arg: 宏va_arg 用于获取下一个可变参数的值。它同样接受两个参数:第一个是 va_list 类型的变量;第二个是参数的类型。

va_end: 宏va_end 用于清理 va_list 类型的变量,确保资源得到释放。

#include <stdarg.h> // 引入 stdarg.h 头文件
#include <stdio.h>  // 引入 stdio.h 头文件
// 定义一个打印可变参数列表的函数
void print_varargs(const char *prefix, ...) {
    // 定义一个 va_list 类型的变量来保存可变参数列表的信息
    va_list args;
    // 使用 va_start 初始化 args 变量
    va_start(args, prefix); // 第二个参数是省略号前的最后一个参数
   // 访问可变参数列表中的每一个参数 
while (1) {
        // 尝试获取一个 int 类型的参数
        int arg = va_arg(args, int);  
       // 如果取到的参数是 0,那么认为参数列表已经结束(这里假设所有参数非零)
      if (arg == 0) {  
       break;
     }        
      // 打印参数 
       printf("%s%d\n", prefix, arg);
   }
    // 使用 va_end 完成对可变参数列表的处理
    va_end(args);
}
int main() {
    // 调用 print_varargs 函数,传入一个前缀字符串和一些整数参数
    print_varargs("Value: ", 10, 20, 30, 0); // 注意,这里的 0 用来标志参数列表的结束    
    return 0;
}

标签:va,函数,int,list,列表,参数,指针
From: https://blog.51cto.com/u_16969274/12108169

相关文章

  • C++考试题带部分答案函数模板
    【1】写出下面程序的运行结果。#include<iostream>   usingnamespacestd;template<classType1,classType2>classmyclass{public:myclass(Type1a,Type2b){i=a;j=b;}voidshow(){cout<<i<<′′<<j<<′\n′;}private:Type1i;T......
  • MySQL 脱敏函数使用
    1.身份证号、手机号、银行卡号采用Perconadata_masking.so插件脱敏https://docs.percona.com/percona-server/8.0/data-masking-plugin-functions.html安装脱敏插件mysql>INSTALLPLUGINdata_maskingSONAME'data_masking.so';mysql>SELECT*FROMINFORMATION_SCHEMA.P......
  • GBASE南大通用GBase 8s数据库Pivot函数
    摘要Summary作为一款企业级的数据库产品,南大通用GBase8s数据库具备杰出的数据处理能力。日常数据处理中,无论是报表制作还是数据分析,我们经常会遇到将行数据转换为列数据的需求。Pivot函数的存在完美解决这一问题,轻松实现行数据到列数据的转换,帮助我们从不同的角度审视数据。本文将......
  • 仿函数(Functor)是什么?
    仿函数(Functor)仿函数是通过重载()运算符的类或结构体的对象。这样一个对象可以像普通函数一样被调用。仿函数通常用于需要在对象内部保留状态或多次调用时有特定行为的情况。特点:仿函数是一个类对象。通过重载()运算符使得类对象像函数一样可以被调用。可以在类中保留状......
  • 【深度学习基础模型】径向基函数网络(Radial Basis Function Networks, RBFN)详细理解并
    【深度学习基础模型】径向基函数网络(RadialBasisFunctionNetworks,RBFN)【深度学习基础模型】径向基函数网络(RadialBasisFunctionNetworks,RBFN)文章目录【深度学习基础模型】径向基函数网络(RadialBasisFunctionNetworks,RBFN)1.算法原理介绍:径向基函数网络(R......
  • 【C语言中的函数指针】
    C语言中的函数指针首先搞一个循环输出字符串数组的功能代码如下:/*filename:funcp.c*/#include<stdio.h>/*compile:gccfuncp.c-ofuncprun:./funcp*//**/intmain(intargc,char*argv[]){char*buff[5]={"Jim","Pike"......
  • 如果值达到 800,如何创建 MySQL 函数来更新数据库?
    我试图让数据库每秒检查一次表,看看XP值是否达到800,如果达到,则将排名值设置为“EliteGenin”并将XP值设置为0。@bot.eventasyncdefon_message(message):guild=message.guild.idtable="PEOPLE_"+str(guild)try:connection=mysql.conn......
  • 值传递、引用传递、指针传递【函数的参数传递】详解
    形参变量:形参变量是功能函数里的变量,只有在被调用的时候才分配内存单元,调用结束后立即释放。所以形参只在函数内部有效。实参变量:实参可以是常量,变量,表达式,函数等等,但无论是何类型,在进行函数调用是,他们必须有确定的值,以便把这些值拷贝给形参。值传递、引用传递和指针传递......
  • P4780 Phi的反函数 题解
    因为\(\varphi(x)\)的值只与\(x\)的不同质因子有关,又因为\(2^{31}\)之内的数的质因子个数不超过\(10\),所以容易枚举\(10\)个位置上填入的质因子打出朴素的暴力,简单剪枝后得到\(20\)分。注意需要先判掉\(x=n+1\)的情况。考虑优化:因为\(\varphi\)的值只与质因......
  • exec 在函数和生成器中
    我需要在python中编写一个自定义exec函数(出于多种目的,但这不是这里的问题,所以这个名为myExec的自定义exec的功能将与现在的exec完全一样)。我进入了这个问题:defmyExec(code):exec(code)code="""a=1print(a)u=[aforxinrange(3)......