首先,printf函数是c中的一个标准库函数 ,作用是按照格式输出数据,
他的格式为printf(格式控制,输出表列);
格式控制通俗的讲就是对输出数据的类型要求,例如
printf(”%d,%f,%lld,%l”,a,b,c,d);//按照十进制整数,单精度浮点数,
//long long,long int输出
当然,我们也可以直接输出字符串
printf(“Hello World”);//直接输出Hello World
然而,printf函数的原型为
extern int printf(const char *format,...);
int printf( char * format , ...)
{
va_list ap;
int n;
va_start (ap,format);
n=vprintf(format ,ap);
va_end(ap);
return n;
}
看了原型后,你可能就会明白。
printf函数和普通函数一样,
把参数分开看,第一个参数是一个char * 类型的参数。
所以我们在上面printf("Hello World");
其实只是将这个存放"Hello World"的地址传递过去,
在函数题内,大致就做了把传递过来的指针进行解引用,然后对字符串进行分割比对。然后再进行显示。
“第二个参数”“...”其实是函数的可变参。表示这个函数的参数个数不是确定的。
可变参函数,至少得有一个参数是确定的,从而确定其他的参数的地址(压栈时,各个参数之间地址是连续的)。
下面你是我写的一个可变参求和函数
这里还要简单说一下压栈的过程。函数调用时,从右向左依次压栈
由于栈从高地址到低地址,所以通过最左边的参数,加上偏移量,就可以得到其他参数。
printf 函数的返回值是在屏幕上显示的字符的个数。
第一行的结果是字符串“Hello World!”加上换行“\n”总共13个字符
所以第二行打印“13”和换行“\n”总共3个字符
所以第三行打印“3”