读书人

再度理解C语言的变参

发布时间: 2012-11-05 09:35:12 作者: rapoo

再次理解C语言的变参

?

实在是令我很郁闷的事啊。

去年用了两天的时间恶补了一下变参,今天看到变参。发现头脑一篇空白,啥都不知道了。

?

古人有云:温故而知新。今日我就在看一遍,做个笔记了。

?

在C语言中,函数参数的传递方式有值传和址传.值传是把实参的一个专用的、临时的复制值给被调函数中相应的形参被调用函数使用、修改这个传来的复制值,不会影响实参的值.址传则是把变量(实参)的地址传给被调函数.被调函数通过这个地址找到该变量的存放位置,直接对该地址中存放的变量的内容进行存取操作.无论是值传还是址传,都要求实参的数目及类型与形参要完全一致。

?

但是在C语言中,在形参表中可以不明确指定传递参数的个数和类型。printf就是一个最好的例子了。这也就是今天要讨论的主要话题--变参函数

?

下面我们通过对可变长参数函数的理解和设计,加深C语言函数设计的思想方法。

?

在标准文件stdarg.h中包含带参数的宏定义:

#include <stdio.h>#include <stdlib.h>#include <stdarg.h>void printf_diy(char *fmt,...) {        va_list arg;        char c;        va_start(arg, fmt);        do {                c = *fmt;                if(c != '%'){                        putchar(c); //输出                }                else {                        fmt++;                        switch(*fmt) {                        case 'd':                                printf("%d", *((int*)arg));                                break;                        case 'x':                                printf("%#x", *((int*)arg));                                break;                        case 'f':                                printf("%f", *((float*)arg));                        default:                                break;                        }                        va_arg(arg,int);                }                ++fmt;        } while (*fmt != '\0');        va_end(arg);        return;}int main(int argc, char **argv) {        int i = 1234;        int j = 5678;        float f = 13.9;        printf_diy("i = %d\n", i);        printf_diy("j = %d\n", j);        printf_diy("f = %f\n", f);        return 0;}                                                                                 

?

输出的结果是:

i = 1234
j = 5678
f = -2.000000

?

这里不明白f会输出的是怎么会是“ -2.000000” 。今天就写到这里了,该问题以后解决。哈哈!

读书人网 >C语言

热点推荐