溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言之 認(rèn)識(shí)可變參數(shù)

發(fā)布時(shí)間:2020-08-02 07:08:25 來(lái)源:網(wǎng)絡(luò) 閱讀:172 作者:飛寞 欄目:開(kāi)發(fā)技術(shù)

  printf()的原型是int printf(const char *fmt, ...);后面三個(gè) . 表示C語(yǔ)言的變參。

  那么什么是變參?它有什么功能和作用呢?

  變參就是參數(shù)不確定,可以隨意根據(jù)需要來(lái)改變的參數(shù)。

  我們先舉一個(gè)固定參數(shù)列表的函數(shù):

int swap(int a,int b)

{

   int c;

   c=a;

   a=b;

   b=c;

   return a; 

}

  這是隨便寫(xiě)的一個(gè)函數(shù),雖然由于里面全都是局部變量的原因所以并不能交換參數(shù),但是這個(gè)函數(shù)的形式還是挺不錯(cuò)的。

  再舉例一個(gè)可變參數(shù)列表函數(shù):

void names(int a , ...)

{

   ……

}

  反正只是定義一個(gè)而已,里面的內(nèi)容就省略了。大家可以看到,下一個(gè)參數(shù)可以是任意的參數(shù),但是局部變量可知,所有參數(shù)的值在調(diào)用時(shí)要被復(fù)制給棧中的連續(xù)內(nèi)存,所以必須有一個(gè)普通變量來(lái)尋址后續(xù)的可變參數(shù)的類型和地址。

  也就是說(shuō),在使用C語(yǔ)言的變參時(shí),需要將變參,也就是...放在最后一個(gè)參數(shù)的位置,并且變參前面至少要有一個(gè)普通的參數(shù)。

  這里有一個(gè)例子:

#include <stdarg.h>

#include <stdio.h>


void func1(const char * str1, ...) 

{

    char    *pp;


    pp = ((char*)&str1) + sizeof(str1); 

    printf("%d\n", *(int*)pp);  

        

    pp =  pp + sizeof(int);

    printf("%d\n", *(int*)pp);


    pp =  pp + sizeof(int);

    printf("%s\n", *((char**)pp));

}


int main()

{

    func1("%d %d %s\n", 4, 5, "hello world");

   return 0;

}

    這個(gè)函數(shù)其實(shí)是不對(duì)的,原因就是里面存在內(nèi)存對(duì)齊這個(gè)問(wèn)題,但是作為認(rèn)識(shí)和了解可變參數(shù)已經(jīng)足夠了。

    這里的const char * str1實(shí)際上指向了一個(gè)待打印輸出的字符串。

現(xiàn)在先了解到這里,以后真正用到的時(shí)候再詳細(xì)討論。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI