青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!!!)

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學院畢業 電子信息工程專業

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 389904
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

可變參數函數設計
#include "stdafx.h"
#include 
<stdio.h>
#include 
<stdarg.h>

int mul(int num,int data1,)
{
    
int total = data1;
    
int arg,i;
    va_list ap;
    va_start(ap,data1);
    
for(i=1;i<num;i++)
    {
        arg 
= va_arg(ap,int);
        total
*=arg;
    }
    va_end(ap);
    
return total;
}

long mul2(int i,)
{
    
int *p,j;
    p 
= &i+1;//p指向參數列表下一個位置
    long s = *p;
    
for (j=1;j<i;j++)
        s 
*= p[j];
    
return s;
}

int main()
{
    printf(
"%d\n",mul(3,2,3,5));
    printf(
"%d\n",mul2(3,2,3,5));
    
return 0;
}



printf的設計
#include "stdio.h"
#include 
"stdlib.h"
#include 
<stdarg.h>

void myprintf(char* fmt, )        //一個簡單的類似于printf的實現,//參數必須都是int 類型
{
    
//char* pArg=NULL;               //等價于原來的va_list
    va_list pArg;
    
char c;
   
   
// pArg = (char*) &fmt;          //注意不要寫成p = fmt !!因為這里要對參數取址,而不是取值
  
// pArg += sizeof(fmt);         //等價于原來的va_start         
    va_start(pArg,fmt);

    
do
    {
        c 
=*fmt;
        
if (c != '%')
        {
            putchar(c);            
//照原樣輸出字符
        }
        
else
        {
//按格式字符輸出數據
            switch(*++fmt)
            {
            
case 'd':
                printf(
"%d",*((int*)pArg));           
                
break;
            
case 'x':
                printf(
"%#x",*((int*)pArg));
                
break;
            
case 'f':
                printf(
"%f",*((float*)pArg));
            
default:
                
break;
            }
            
//pArg += sizeof(int);               //等價于原來的va_arg
            va_arg(pArg,int);
        }
        
++fmt;
    }
while (*fmt != '\0');
    
//pArg = NULL;                               //等價于va_end
    va_end(pArg);
    
return;
}
int main(int argc, char* argv[])
{
    
int i = 1234;
    
int j = 5678;
   
    myprintf(
"the first test:i=%d",i,j);
    myprintf(
"the secend test:i=%f; %x;j=%d;",i,0xabcd,j);
    system(
"pause");
    
return 0;
}


可變參數在編譯器中的處理 

    我們知道va_start,va_arg,va_end是在stdarg.h中被定義成宏的, 由于1)硬件平臺的不同 2)編譯器的不同,所以定義的宏也有所不同,下面以VC++stdarg.hx86平臺的宏定義摘錄如下(’"’號表示折行):
typedef char * va_list; 
#define _INTSIZEOF(n) \ 
((
sizeof(n)+sizeof(int)-1)&~(sizeof(int- 1) ) 
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) 
#define va_arg(ap,t) \ 
*(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 
#define va_end(ap) ( ap = (va_list)0 ) 

    定義_INTSIZEOF(n)主要是為了某些需要內存的對齊的系統.C語言的函數是從右向左壓入堆棧的,(1)是函數的參數在堆棧中的分布位置.我們看到va_list被定義成char*,有一些平臺或操作系統定義為void*.再看va_start的定義,定義為&v+_INTSIZEOF(v),&v是固定參數在堆棧的地址,所以我們運行va_start(ap, v)以后,ap指向第一個可變參數在堆棧的地址,如圖:

高地址|-----------------------------| 
|函數返回地址 | 
|-----------------------------| 
|| 
|-----------------------------| 
|第n個參數(第一個可變參數) | 
|-----------------------------|<--va_start后ap指向 
|第n-1個參數(最后一個固定參數)| 
低地址
|-----------------------------|<-- &
圖( 
1 ) 

    然后,我們用va_arg()取得類型t的可變參數值,以上例為int型為例,我們看一下va_argint型的返回值: j= ( *(int*)((ap += _INTSIZEOF(int))-_INTSIZEOF(int)) );
首先ap+=sizeof(int),已經指向下一個參數的地址了.然后返回ap-sizeof(int)int*指針,這正是第一個可變參數在堆棧里的地址(2).然后用*取得這個地址的內容(參數值)賦給j.

高地址|-----------------------------| 
|函數返回地址 | 
|-----------------------------| 
|| 
|-----------------------------|<--va_arg后ap指向 
|第n個參數(第一個可變參數) | 
|-----------------------------|<--va_start后ap指向 
|第n-1個參數(最后一個固定參數)| 
低地址
|-----------------------------|<-- &
圖( 
2 ) 

    最后要說的是va_end宏的意思,x86平臺定義為ap=(char*)0;使ap不再指向堆棧,而是跟NULL一樣.有些直接定義為((void*)0),這樣編譯器不會為va_end產生代碼,例如gcclinuxx86平臺就是這樣定義的.在這里大家要注意一個問題:由于參數的地址用于va_start,所以參數不能聲明為寄存器變量或作為函數或數組類型.關于va_start, va_arg, va_end的描述就是這些了,我們要注意的是不同的操作系統和硬件平臺的定義有些不同,但原理卻是相似的

posted on 2007-09-02 12:29 @王一偉 閱讀(1333) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99视频在线观看一区三区| 国产精品亚洲综合| 久久激情视频免费观看| 欧美精品一区二区视频 | 尤物99国产成人精品视频| 一本色道久久综合| 亚洲人成亚洲人成在线观看图片 | 国产一区二区三区黄| 亚洲精品一区二区三区四区高清| 一区精品久久| 久久精品在这里| 久久久久综合| 国产一区二区三区丝袜| 亚洲欧美日韩成人高清在线一区| 亚洲视频大全| 欧美精品一区二区三区蜜臀| 免费成人黄色| 激情综合久久| 久久亚洲不卡| 女仆av观看一区| 亚洲福利小视频| 免费观看30秒视频久久| 欧美成人一区二区| 亚洲高清二区| 久久综合九色综合久99| 老巨人导航500精品| 精品999成人| 免费在线播放第一区高清av| 免费亚洲一区二区| 亚洲啪啪91| 欧美精品色网| 亚洲视频你懂的| 久久福利影视| 在线观看精品视频| 蜜桃久久av| 亚洲精品中文字幕女同| 亚洲一区在线视频| 国产伦精品一区二区| 久久国产精品72免费观看| 美女亚洲精品| 99在线|亚洲一区二区| 欧美午夜女人视频在线| 亚洲免费影视| 六十路精品视频| 一本久道久久综合狠狠爱| 国产精品va| 欧美一区二区三区电影在线观看| 麻豆91精品91久久久的内涵| 亚洲日本一区二区| 国产精品初高中精品久久| 欧美一区91| 欧美激情精品久久久| 亚洲一区二区高清视频| 国产综合网站| 欧美激情亚洲视频| 亚洲欧美美女| 亚洲国产成人av在线| 亚洲欧美久久久| 在线观看91精品国产麻豆| 欧美日产一区二区三区在线观看| 亚洲欧美日韩系列| 亚洲第一在线视频| 欧美伊人久久| 日韩一级成人av| 国产一区二区三区在线观看视频 | 久久精品国产成人| 亚洲精品麻豆| 韩国女主播一区| 欧美日韩精品一区| 久久精品视频免费观看| 在线一区观看| 亚洲欧洲精品一区二区| 久久久久久伊人| 亚洲免费在线电影| 亚洲欧洲一区| 极品尤物av久久免费看| 国产精品久久久对白| 欧美成人午夜| 久久久久久成人| 亚洲欧美亚洲| 亚洲色图在线视频| 亚洲区一区二| 亚洲第一级黄色片| 久久另类ts人妖一区二区| 亚洲免费在线观看视频| 亚洲免费成人| 在线观看欧美成人| 国产精品一区二区在线观看网站| 欧美日韩免费高清| 欧美—级a级欧美特级ar全黄| 久久夜色精品国产欧美乱| 午夜精品一区二区在线观看| 一区二区欧美视频| 日韩视频在线观看国产| 亚洲精品1区2区| 欧美va日韩va| 久久精品国产精品亚洲| 欧美一区二区三区视频在线观看| 一区二区三区视频在线观看| 国产婷婷精品| 国产午夜精品久久久| 国产精品美女999| 国产精品a久久久久| 欧美视频一区| 国产精品久久久久久久app| 欧美日韩一二区| 欧美日韩一区二区三区在线看| 欧美精品久久久久久久久久| 欧美国产日韩在线| 欧美日本一区二区高清播放视频| 欧美高清hd18日本| 欧美日韩成人在线播放| 欧美日韩免费一区二区三区| 欧美日韩一区精品| 国产精品嫩草99a| 国产欧美日韩另类视频免费观看| 国产精品亚洲一区| 国产一区二区三区丝袜| 红桃视频国产一区| 亚洲国产婷婷香蕉久久久久久99| 亚洲国产欧美日韩| 99成人在线| 亚洲永久在线观看| 久久aⅴ国产欧美74aaa| 久久综合九色| 亚洲国产精品一区二区第一页| 亚洲精品永久免费| 亚洲影视在线| 久久久亚洲人| 欧美日韩一区二区三| 国产精品无码永久免费888| 国产一区二区三区精品欧美日韩一区二区三区| 国产一区二区三区不卡在线观看 | 久久国产精品一区二区三区| 久久影视三级福利片| 欧美激情黄色片| 在线亚洲电影| 久久综合网hezyo| 欧美午夜片在线免费观看| 国产日韩欧美黄色| 亚洲三级电影全部在线观看高清| 亚洲伊人第一页| 美女视频一区免费观看| 夜夜精品视频| 久久久综合视频| 国产精品福利影院| 亚洲电影在线观看| 亚洲中无吗在线| 欧美大片在线观看| 亚洲一区二区三区精品在线 | 国产精品视频区| 亚洲国产岛国毛片在线| 亚洲欧美在线看| 欧美激情小视频| 午夜精品视频| 欧美日韩日韩| 亚洲国产精品日韩| 久久高清福利视频| 亚洲伦理中文字幕| 久久野战av| 国产自产精品| 亚洲欧美精品中文字幕在线| 亚洲国产精品日韩| 久久免费视频网| 国产日韩精品入口| 亚洲永久免费av| 亚洲黄色三级| 美日韩免费视频| 黄色成人在线| 久久国产夜色精品鲁鲁99| 亚洲精品色图| 欧美激情免费在线| 亚洲国产高清在线观看视频| 久久精品电影| 一本久道综合久久精品| 欧美激情国产日韩精品一区18| 黄色欧美日韩| 久久精品欧美日韩| 亚洲综合成人在线| 国产精品白丝jk黑袜喷水| aa亚洲婷婷| 亚洲精品在线观看视频| 欧美成人蜜桃| 亚洲精品在线视频观看| 欧美黄色aaaa| 欧美va亚洲va国产综合| 亚洲国产日韩欧美在线动漫 | 校园春色国产精品| 亚洲精品一区二区三区不| 欧美国产日韩视频| 亚洲三级电影全部在线观看高清| 奶水喷射视频一区| 久久午夜激情| 亚洲激情二区| 亚洲欧洲日夜超级视频| 欧美日韩成人一区二区| 中文网丁香综合网| 日韩视频一区二区三区在线播放免费观看 | 99精品视频免费在线观看| 亚洲日本成人女熟在线观看|