[セットトップ]関数伝達不定パラメータ理解-c言語

1378 ワード

感性認識.
 
Typedef char *va_list;/* <stdatg.h> */

#define va_start(ap,p) (ap=(char*)(&(p)+1))

#define va_arg(ap,type) ((type*)(ap+=sizeof(type)))[-1]

#defien va_end(ap)



/* */

#include<stdio.h>

#include<stdlib.h>

#include<stdarg.h>

void fun(char *s, ... ) /* ... */

{

	va_list ap;

	int t; /* main() a,b,c  */

	va_start(ap,s);

	printf("%s",s);

	while((t=va_arg(ap,int)))

	printf("%d",t);

	va_end(ap);

}

main()

{

	int a=1,b=2,c=3;

	fun('test:",a,b,c,NULL);/* NULL */	

	printf("
"); }

 
 
 
内部マクロ定義1、#define vaの解釈start(ap,p) (ap=(char*)(&(p)+1))
パラメータap:fun関数パラメータを取得...の最初の要素アドレス;
2、#define va_arg(ap,type) ((type*)(ap+=sizeof(type)))[-1]
パラメータap:次のパラメータ要素アドレスに移動します.
1)、apは文字ポインタであり、すべてのap+1は1つのアドレスを下に移動することを意味する[1つのアドレスが8ビット(1文字)格納されているため].
2)、ap+=sizeof(type):よりタイプが対応する位置を移動することを意味する.[typeがint型の場合apは4アドレス後ろに移動する]
3)、(type*)(ポインタアドレス)[-1]:全体的な意味はap上のアドレス位置に戻ることである.
(type*)(ポインタアドレス):apを指す次のポインタアドレスが(type*)型に強く移行する.
(ポインタアドレス)[-1]:ポインタアドレスタイプに応じて1つ前に移動する.[typeがintであれば4アドレス前へ移動]
[注意:
1)、1つの住所は8ビット保管する;
2)、ポインタの移動位置はポインタの種類によって移動する.
char*pの場合、移動は1つのアドレスです.char**pの場合、移動は4つのアドレス(char**ポインタ32ビット記憶)である.int*pであれば移動も4アドレス(int*もポインタアドレス)]
#defien va_end(ap)
終わりを表す.