1. 程式人生 > >C語言可變長引數列表原理與實現

C語言可變長引數列表原理與實現

可變引數在程式設計中的實現。
stdarg.h標準庫提供的巨集支援了可變長引數列表的使用。
當然,在一些情況下也可以自己通過其實現原理來使用可變長引數程式設計。
條件一:
C語言程式設計中函式的形參入棧順序都是從右至左。棧的生長方向是,低地址《—— 高地址,而且棧由系統分配,不存在碎片化記憶體。
結論:只要知道一個引數的地址,就可以順勢推出其他引數的地址。

在使用可變長引數的情形下,都會想方設法的標註引數的型別和個數,因為我們無從得知!
最經典的用法:extern int printf(const char *format,…);函式,再給出的一個個%d和%f等等條件中,統計%即可知道攜帶了幾個引數,與%之配對的字元代表了對應位置的
引數型別。
假設:printf(“a:%d , b:%f!”, 10, 20.0f);
程式設計思路:
遇到了第一個%代表該取參了:
char *p = &format+1;//指向第一個引數10的低地址
並且第一個%匹配的引數是型別“d”,那就通過 int a = (int

)p;來取數,順便 p += sizeof(int);使其指向下一段記憶體的低地址。

//試驗原始碼
#include<stdlib.h>
#include<stdio.h>
int print(int nnum,...);

int main()
{
    print(1, 2, 3.0f, 4, 5);
    system("pause");
}

int print(int nnum, ...)
{
    char *p =(char *)(&nnum + 1);   
    printf("%d", *(int *)p);
    p += sizeof
(int); printf("%f", *(double *)p);//很多編譯器總是以double長度來儲存float,取用的時候進行截斷。 p += sizeof(double); printf("%d", *(int *)p); p += sizeof(int); printf("%d", *(int *)p); p += sizeof(int); return 0; }