C 언어 가 변 매개 변수 valist
#include
#include
#include
/*
1. va_list va_start va_arg va_end
*/
void simple_va_fun(int i, ...) {
va_list arguments;
int j = 0;
int k, m;
va_start(arguments, i);
j = va_arg(arguments, int);
m = va_arg(arguments, int);
va_end(arguments);
printf("%d,%d,%d
",i,j,m);
}
/*
2.
*/
void fixed_args_func(char x, int a, double b, char *c)
{ //
printf("x = 0x%p
", &x);
printf("a = 0x%p
", &a);
printf("b = 0x%p
", &b);
printf("c = 0x%p
", &c);
}
/*
3. ,
*/
void var_args_func(const char * fmt, ...) {
char* ap;
ap = (char *)&fmt + sizeof(fmt);
int* int_ap = (int *)ap;
printf("first:%d
",*int_ap);
int_ap = int_ap + 1;
printf("second:%d
",*int_ap);
int_ap = int_ap + 1;// string start index
char* c_ptr = (char*)int_ap;
char* str = (char* )*int_ap;
printf("&int_ap = 0x%p
",int_ap);
printf("&c_ptr = 0x%p
", c_ptr);
printf("&str = 0x%p
",str);
// "helloworld ",
printf("third1: %s
",str);
printf("third2: %s
", *(char **)int_ap);
}
//stdarg.h
void std_vararg_func(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
printf("%d
", va_arg(ap, int));
printf("%f
", va_arg(ap, double));
printf("%s
", va_arg(ap, char*));
va_end(ap);
}
int main() {
//fixed_args_func('a',17, 5.40, "hello world");
//char* p = "xiongwei";
//printf("%d
",sizeof(p));
var_args_func("%d %d %s
", 4, 5, "helloworld");
printf("--------------------------------------
");
std_vararg_func("%d %f %s
", 4, 5.4, "helloworld");
system("pause");
return 0;
}
std 비교vararg_func 와 varargs_func 의 실현,valist 는 char*,va 인 것 같 습 니 다.start 는(char*)&fmt)+sizeof(fmt),va 인 것 같 습 니 다.arg 는 다음 인자 의 첫 주 소 를 얻 은 것 같 습 니 다.맞 아,대부분의 플랫폼 에서 stdarg.h 중 valist, va_start 와 vararg 의 실현 은 이와 유사 하 다.일반적으로 stdarg.h 는 매크로 를 많이 포함 하고 복잡 해 보 입 니 다.일부 시스템 에서 stdarg.h 의 실현 은 some special functions built into the compilation system to handle variable argument lists and stack allocations 에 의존 합 니 다.대부분의 다른 시스템 의 실현 은 아래 와 비슷 합 니 다.(Visual C+6.0 의 실현 이 비교적 뚜렷 합 니 다.windows 의 응용 프로그램 은 windows 플랫폼 에서 만 이식 하면 되 기 때 문 입 니 다.플랫폼 상황 을 너무 많이 고려 할 필요 가 없다).
output://
first:4
second : 5
& int_ap = 0x003EF968
& c_ptr = 0x003EF968
& str = 0x013780D4
third1 : helloworld
third2 : helloworld
--------------------------------------
4
5.400000
helloworld
Printf()함수 구현:
#include "stdio.h"
#include "stdlib.h"
void myprintf( char* fmt, ... ) /* printf ,// int */
{
char * pArg = NULL; /* va_list */
char c;
pArg = (char *) &fmt; /* p = fmt !! // , */
pArg += sizeof(fmt); /* va_start */
do
{
c = *fmt;
if ( c != '%' )
{
putchar( c ); /* */
}else {
/* */
switch ( *++fmt )
{
case 'd':
printf( "%d", *( (int *) pArg) );
break;
case 'x':
printf( "%#x", *( (int *) pArg) );
break;
default:
break;
}
pArg += sizeof(int); /* va_arg */
}
++fmt;
}
while ( *fmt != '\0' );
pArg = NULL; /* va_end */
return;
}
int main( int argc, char* argv[] )
{
int i = 1234;
int j = 5678;
myprintf( "thefirst test:i=%d", i, j );
myprintf( "thesecend test:i=%d; %x;j=%d;", i, 0xabcd, j );
system( "pause" );
return(0);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
HDU 원활 공사 & & 원활 공사 (차 트 법)모 성 은 도시 의 교통 상황 을 조사 하여 기 존의 도시 도로 통계 표를 얻 었 고 표 에는 모든 도로 가 직접 연 결 된 도시 가 열거 되 어 있다.성 정부의 '원활 한 공사' 목 표 는 성 전체의 어느 두 도시...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.