C/C++实践笔记 014自己实现可变参数的函数

一、什么是函数?—根据输入进行处理返回输出
(void) 参数为空

函数的默认类型是int,可以省略

函数的副本机制

参数传递是单向值传递

C语言参数过多会警告,多的会忽略,结果不保证正确
C语言尽量类型一致,个数一致
return也会完成类型转换

C语言函数不返回可以编译,但是结果自负

副本机制通过赋值,赋值会自动类型转换

函数除了数组外,都是副本

函数执行过程

C语言函数一定要加声明,加了声明一定不会出错,不加声明有可能出错

函数的执行顺序:从下往上进栈,从上往下执行。

函数参数运算顺序:从右面的参数开始算 (int a,int b) 先计算b的值,再计算a的值,从右往左
show(a,a++); //执行结果6,5

二、函数可变参数的实现
1.int可变参数:

#include<stdarg.h> // 标准参数
int add(int num,...) //...代表可变参数
{
    int res=0; //结果
    va_list argp; //存储参数开始的地址
    va_start(argp,num); // 从首地址开始,读取num后面的数据
    for(int i=0;i<num;i++)
    {
        res+=va_arg(argp,int); //读取一个数据按照int类型解析
    }
    va_end(argp); //结束读取
    return res;
}

2.字符串可变参数:

void go(int num,...)
{
    va_list argp; //存储参数开始的地址
    va_start(argp,num); // 从首地址开始,读取num后面的数据

    for(int i=0;i<num;i++)
    {
        char str[50];
        sprintf(str,"%s",va_arg(argp,char *));
        system(str); //读取一个数据按照char *解析
    }
    va_end(argp); //结束读取
}

如果个数也不知道:

void showint(int start,...)
{
    va_list argp; //存储参数开始的地址
    va_start(argp,start); // 从首地址开始,读取num后面的数据
    int argvalue=start; //第一步初始化
    do
    {    
        printf("\n%d",argvalue);
        argvalue=va_arg(argp,int); //不断读取
    }while(argvalue!=-1);
    va_end(argp); //结束读取
}


三、C函数声明
声明可以有多个,定义只能有一个
理论上一定要加声明

int a; //全局变量声明,没有初始化默认为0,有的话就是默认的值
int a=9; //全局变量定义,只能有一个
全局变量,跨文件都可以调用
如果重名,局部变量会屏蔽全局变量,内部块语句变量会屏蔽外部变量
全局变量,很容易被覆盖,很容易被读写


局部变量没有声明与定义的区别


int add(int ,int ); //声明的变量名可以省略,要加分号,声明要与定义匹配

posted @ 2016-12-31 20:42  千年风雅丶  阅读(250)  评论(0)    收藏  举报