测试代码:
#include <stdio.h>
void printf_test(void)
{
printf("hello word\n");
printf("This is www.100ask.org my_printf test\n") ;
printf("test char =%c,%c\n", 'A','a') ;
printf("test decimal number =%d\n", 123456) ;
printf("test decimal number =%d\n", -123456) ;
printf("test hex number =0x%x\n", 0x55aa55aa) ;
printf("test string =%s\n", "www.100ask.org") ;
}
int main(int argc ,char *argv[])
{
printf_test();
return 0;
}
效果:
hello word
This is www.100ask.org my_printf test
test char =A,a
test decimal number =123456
test decimal number =-123456
test hex number =0x55aa55aa
test string =www.100ask.org
下面对printf进行分析
printf函数原型
int printf(const char *format, …);
format :固定参数
… :可变参数
代码如下:
方法一:
#include <stdio.h>
struct person{
char *name;
int age;
char score;
int id;
};
/*
*int printf(const char *format, ...);
*依据:x86平台,函数调用时参数传递是使用堆栈来实现的
*目的:将所有传入的参数全部打印出来
*/
int push_test(const char *format, ...)
{
char *p = (char *)&format;
int i;
struct person per;
char c;
double d;
printf("arg1 : %s\n",format);
//==============
p = p + sizeof(char *);
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
i = *((int *)p);
p = p + sizeof(int);
printf("arg2 : %d\n",i);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
per = *((struct person *)p);
p = p + sizeof(struct person);
printf("arg3: .name = %s, .age = %d, .socre=%c .id=%d\n",\
per.name, per.age, per.score, per.id);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
c = *((char *)p);
p = p + ((sizeof(char) + 3) & ~3);
printf("arg4: %c\n",c);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
d = *((double *)p);
p = p + sizeof(double);
printf("arg5: %f\n",d);
return 0;
}
int main(int argc,char **argv)
{
struct person per={"www.100ask.org",10,'A',123};
printf("sizeof(char )=%d\n",sizeof(char ));
printf("sizeof(int )=%d\n",sizeof(int ));
printf("sizeof(char *)=%d\n",sizeof(char *));
printf("sizeof(char **)=%d\n",sizeof(char **));
printf("sizeof(struct person)=%d\n",sizeof(struct person));
//push_test("abcd");
//push_test("abcd",123);
//push_test("abcd",123,per);
//push_test("abcd",123,per,'c');
push_test("abcd",123,per,'c',2.79);
return 0;
}
方法二:
#include <stdio.h>
struct person{
char *name;
int age;
char score;
int id;
};
/*
*int printf(const char *format, ...);
*依据:x86平台,函数调用时参数传递是使用堆栈来实现的
*目的:将所有传入的参数全部打印出来
*/
int push_test(const char *format, ...)
{
char *p = (char *)&format;
int i;
struct person per;
char c;
double d;
printf("arg1 : %s\n",format);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
p = p + sizeof(char *);
i = *((int *)p);
printf("arg2 : %d\n",i);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
p = p + sizeof(int);
per = *((struct person *)p);
printf("arg3: .name = %s, .age = %d, .socre=%c .id=%d\n",\
per.name, per.age, per.score, per.id);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
p = p + sizeof(struct person);
c = *((char *)p);
printf("arg4: %c\n",c);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
p = p + ((sizeof(char) + 3) & ~3);
d = *((double *)p);
printf("arg5: %f\n",d);
return 0;
}
int main(int argc,char **argv)
{
struct person per={"www.100ask.org",10,'A',123};
printf("sizeof(char )=%d\n",sizeof(char ));
printf("sizeof(int )=%d\n",sizeof(int ));
printf("sizeof(char *)=%d\n",sizeof(char *));
printf("sizeof(char **)=%d\n",sizeof(char **));
printf("sizeof(struct person)=%d\n",sizeof(struct person));
//push_test("abcd");
//push_test("abcd",123);
//push_test("abcd",123,per);
//push_test("abcd",123,per,'c');
push_test("abcd",123,per,'c',2.79);
return 0;
}
方法三:调用库文件(stdarg.h)
代码如下:
#include <stdio.h>
#include <stdarg.h>
struct person{
char *name;
int age;
char score;
int id;
};
/*
*int printf(const char *format, ...);
*依据:x86平台,函数调用时参数传递是使用堆栈来实现的
*目的:将所有传入的参数全部打印出来
*/
int push_test(const char *format, ...)
{
//char *p = (char *)&format;
int i;
struct person per;
char c;
double d;
va_list p;
printf("arg1 : %s\n",format);
//==============
//p = p + sizeof(char *);
va_start(p, format );
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
//i = *((int *)p);
//p = p + sizeof(int);
i = va_arg(p,int);
printf("arg2 : %d\n",i);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
//per = *((struct person *)p);
//p = p + sizeof(struct person);
per = va_arg(p,struct person);
printf("arg3: .name = %s, .age = %d, .socre=%c .id=%d\n",\
per.name, per.age, per.score, per.id);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
//c = *((char *)p);
//p = p + ((sizeof(char) + 3) & ~3);
c = va_arg(p,int);
printf("arg4: %c\n",c);
//==============
/*指针对连续空间操作时: 1) 取值 2)移动指针*/
//d = *((double *)p);
//p = p + sizeof(double);
d = va_arg(p,double);
/*避免"野指针"*/
//p = (char *)0;
va_end( p );
printf("arg5: %f\n",d);
return 0;
}
int main(int argc,char **argv)
{
struct person per={"www.100ask.org",10,'A',123};
printf("sizeof(char )=%d\n",sizeof(char ));
printf("sizeof(int )=%d\n",sizeof(int ));
printf("sizeof(char *)=%d\n",sizeof(char *));
printf("sizeof(char **)=%d\n",sizeof(char **));
printf("sizeof(struct person)=%d\n",sizeof(struct person));
//push_test("abcd");
//push_test("abcd",123);
//push_test("abcd",123,per);
//push_test("abcd",123,per,'c');
push_test("abcd",123,per,'c',2.79);
return 0;
}
stdarg.h中
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_arg(ap,t) (ap = ap + _INTSIZEOF(t), *(t *)(ap - _INTSIZEOF(t)))
#define va_arg(ap,t) (*(t *)(ap = ap + _INTSIZEOF(t), ap - _INTSIZEOF(t)))
#define va_end(ap) ( ap = (va_list)0 )