[セットトップ]関数伝達不定パラメータ理解-c言語
1378 ワード
感性認識.
内部マクロ定義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)
終わりを表す.
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)
終わりを表す.