亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

關于C/C++中可變參數的詳細介紹(va_list,va_start,va_arg,va_end)

2020-01-26 15:47:30
字體:
來源:轉載
供稿:網友

由于在C語言中沒有函數重載,解決不定數目函數參數問題變得比較麻煩,即使采用C++,如果參數個數不能確定,也很難采用函數重載。對這種情況,提出了指針參數來解決問題。

如printf()函數,其原型為:
int   printf(   const   char*   format,   ...);

它除了有一個參數format固定以外,后面跟的參數的個數和類型是可變的,例如我們可以有以下不同的調用方法:  
printf( "%d ",i);  
printf( "%s ",s);  
printf( "the   number   is   %d   ,string   is:%s ",   i,   s);  

如何實現其功能?

我們需要以下幾個宏定義:

(1)va_list
定義了一個指針arg_ptr, 用于指示可選的參數.

(2)va_start(arg_ptr, argN)
使參數列表指針arg_ptr指向函數參數列表中的第一個可選參數,argN是位于第一個可選參數之前的固定參數, 或者說最后一個固定參數.如有一va函數的聲明是void va_test(char a, char b, char c, ...), 則它的固定參數依次是a,b,c, 最后一個固定參數argN為c, 因此就是va_start(arg_ptr, c).

(3)va_arg(arg_ptr, type)
返回參數列表中指針arg_ptr所指的參數, 返回類型為type. 并使指針arg_ptr指向參數列表中下一個參數.返回的是可選參數, 不包括固定參數.

(4)va_end(arg_ptr)
清空參數列表, 并置參數指針arg_ptr無效.

(注:va在這里是variable-argument(可變參數)的意思.   這些宏定義在stdarg.h中,所以用到可變參數的程序應該包含這個頭文件)

也需你現在還是不能理解,別著急,現在從一個實例著手.定義這么一個函數,函數的第一個參數是固定的,其余參數是可變的。定義為:
void   simple_va_fun(int i,...); 其代碼為:

復制代碼 代碼如下:

#include <iostream>
#include <stdarg.h>
using namespace std;
void simple_va_fun(int i,...);

int main(int argc,char *argv[])
{
    simple_va_fun(100);  
    simple_va_fun(100,200);
    simple_va_fun(100,200,'a');
    return 0;
}

void simple_va_fun(int i,...)  
{  
    va_list   arg_ptr;   //定義可變參數指針
    va_start(arg_ptr,i);   // i為最后一個固定參數
    int j=va_arg(arg_ptr,int);   //返回第一個可變參數,類型為int
    char c=va_arg(arg_ptr,char);   //返回第二個可變參數,類型為char
    va_end(arg_ptr);        //  清空參數指針
    printf( "%d %d %c/n",i,j,c);  
    return;  
}


代碼運行解釋:  
(1)首先在函數里定義一個va_list型的變量,這里是arg_ptr,這個變量是指向參數的指針.

(2)然后用va_start宏初始化變量arg_ptr,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數.

(3)然后用va_arg返回第一個可變的參數,并賦值給整數j。va_arg的第二個參數是你要返回的參數的類型,這里是int型.  返回第一個可變參數后arg_ptr指向第二個可變參數,用同樣的方法返回并賦值給c,類型為char類型。

(4)最后用va_end宏結束可變參數的獲取。

小結:
可變參數的函數原理其實很簡單,而va系列是以宏定義來定義的,實現跟堆棧相關.我們寫一個可變函數的C函數時,有利也有弊,所以在不必要的場合,我們無需用到可變參數.如果在C++里,我們應該利用C++的多態性來實現可變參數的功能,盡量避免用C語言的方式來實現。

附加:

參數在堆棧中分布:
在進程中,堆棧地址是從高到低分配的.當執行一個函數的時候,將參數列表入棧,壓入堆棧的高地址部分,然后入棧函數的返回地址,接著入棧函數的執行代碼,這個入棧過程,堆棧地址不斷遞減,一些黑客就是在堆棧中修改函數返回地址,執行自己的代碼來達到執行自己插入的代碼段的目的. 總之,函數在堆棧中的分布情況是:地址從高到低,依次是:函數參數列表,函數返回地址,函數執行代碼段. 堆棧中,各個函數的分布情況是倒序的.即最后一個參數在列表中地址最高部分,第一個參數在列表地址的最低部分.參數在堆棧中的分布情況如下:

最后一個參數
倒數第二個參數
...
第一個參數
函數返回地址
函數代碼段

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产高清久久久久久久久| 欧美激情图片区| 亚洲欧美中文日韩在线| 久久精品国产成人精品| 国产欧美一区二区三区在线| 国产999在线| 奇米影视亚洲狠狠色| 精品亚洲一区二区| 欧美日韩国产999| 欧美在线观看网站| 欧美在线激情网| 亚洲精品av在线| 97在线看免费观看视频在线观看| 亚洲www在线| 成人激情在线播放| 国产欧美精品一区二区三区-老狼| 2019最新中文字幕| 久久久久中文字幕2018| 中文在线资源观看视频网站免费不卡| 日韩精品久久久久久久玫瑰园| 欧美激情按摩在线| 欧美高清第一页| 777国产偷窥盗摄精品视频| 日本道色综合久久影院| 亚洲国产精品va| 日韩电影在线观看中文字幕| 激情成人中文字幕| 成人黄色午夜影院| 在线视频欧美日韩精品| 精品久久久久人成| 日韩国产精品视频| 亚洲欧洲午夜一线一品| 激情久久av一区av二区av三区| 中文国产成人精品久久一| 国产91精品视频在线观看| 国产精品成人免费视频| 欧美日韩免费网站| 欧美性猛交xxxx免费看久久久| 亚洲www永久成人夜色| 国产一区二区在线免费| 国产精品自产拍高潮在线观看| 91久久久久久久久久| 日韩中文字幕在线视频播放| 国产+成+人+亚洲欧洲| 欧美wwwxxxx| 亚洲精品自拍第一页| 欧美日韩国产在线看| 一区二区日韩精品| 久热精品视频在线观看| 91精品国产高清久久久久久91| 成人动漫网站在线观看| 久久综合色影院| 国产99久久久欧美黑人| 97久久超碰福利国产精品…| 欧美成人精品在线观看| 欧洲成人免费aa| 成人精品aaaa网站| 亚洲精品美女久久久| 日韩免费不卡av| 成人免费视频a| 精品免费在线观看| 亚洲精品mp4| 欧美日韩在线另类| 欧美成人午夜激情在线| 亚洲精品在线不卡| …久久精品99久久香蕉国产| 美女国内精品自产拍在线播放| 亚洲自拍小视频| 97色在线视频观看| 亚洲欧美日韩精品久久| 国产成人综合久久| 久久精品这里热有精品| 在线色欧美三级视频| 91亚洲精华国产精华| 欧美成人在线影院| 美女啪啪无遮挡免费久久网站| 7777精品视频| 欧美亚洲成人网| 国产精品99蜜臀久久不卡二区| 亚洲视频第一页| 国产欧美精品在线| 欧美精品在线极品| 欧美日韩加勒比精品一区| 欧美激情免费观看| 日韩在线视频观看正片免费网站| 亚洲欧美日韩在线一区| 亚洲国产精品嫩草影院久久| 国产精品日韩在线| 欧美另类在线观看| 亚洲最大的免费| 亚洲一区二区三区四区在线播放| 亚洲va欧美va国产综合剧情| 精品久久久久久中文字幕大豆网| 国产精品永久在线| 日本电影亚洲天堂| 日本精品免费一区二区三区| 国产精品∨欧美精品v日韩精品| 在线成人中文字幕| 亚洲国产日韩欧美在线99| 欧美激情视频一区二区| 亚洲精品视频在线观看视频| 色婷婷久久一区二区| 国产成人短视频| 国产一区二区三区在线免费观看| 国产精品高清免费在线观看| www欧美日韩| 久久精品成人动漫| 欧美午夜女人视频在线| 欧美性猛交xxxx乱大交极品| 日韩成人av在线播放| 国产日韩在线视频| 亚洲网站在线播放| 亚洲美女av在线播放| 97在线视频国产| 色香阁99久久精品久久久| 国产成人精品久久亚洲高清不卡| 91精品视频网站| 久久精品青青大伊人av| 日韩美女视频中文字幕| 欧美成人精品xxx| 91久久久久久国产精品| 韩日欧美一区二区| 欧美在线观看www| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产午夜精品一区二区三区| 国产精品永久免费视频| 亚洲美女免费精品视频在线观看| 国产精品视频精品| 91精品久久久久久久久久久久久久| 欧美又大又硬又粗bbbbb| 成人综合国产精品| 操日韩av在线电影| 欧美成人免费播放| 色琪琪综合男人的天堂aⅴ视频| 国产精品自拍偷拍| 欧美精品久久久久久久久| 国产精品一区二区三区久久久| 亚洲成人黄色在线| 亚洲人成在线观| 亚洲字幕在线观看| 国产精品视频网站| 超碰精品一区二区三区乱码| 欧美另类在线观看| 成人做爰www免费看视频网站| 国产精品a久久久久久| 色婷婷**av毛片一区| 精品国内产的精品视频在线观看| 成人做爰www免费看视频网站| 久久精品国产亚洲精品2020| 亚洲www永久成人夜色| 欧美小视频在线观看| 国产精品专区第二| 日本精品性网站在线观看| 在线看国产精品| 色综合久久久久久中文网| 永久555www成人免费| 这里只有精品在线播放| 欧美电影在线观看网站| 日韩精品视频免费专区在线播放| 欧美激情网站在线观看| 成人福利视频在线观看| 欧美一区二区大胆人体摄影专业网站| 日本在线观看天堂男亚洲| 精品国产一区二区三区久久狼黑人|