200分求c中可变参数的问题

来源:百度知道 编辑:UC知道 时间:2024/05/12 13:01:44
问题在这下面,也是我问的
http://zhidao.baidu.com/question/94744512.html
是120分的,能讲清楚的2个分都给你
请看那个问题的这里:
void var_args_func(const char * fmt, ... )
函数原型里fmt就是一个指针了,所以fmt就应该是个地址了,
&fmt应该是2级地址了
我还求注释那句话的解释如果&fmt是二级指针,那么强制转化成(char *)不久指向错误的地址了?
还有即使是为什么还要加上 + sizeof(fmt) 呢?
在机器上运行sizeof(fmt)=4;

传递给var_args_func的参数有个四个:一个字串指针,2个整数和另一个字串指针。
函数使用的参数通过堆栈进行传递,所以堆栈的内容看起来应该像这样:

字串指针 <- SP(即栈顶)
整数
整数
字串指针

可以把上面的一系列数据当作一个数组来看待,(char*)&fmt就是取栈顶字串指针变量的地址,
之后将它赋值给字符指针变量ap就可以数组的方式访问上面的数据项。如
ap[0] = 字串指针
ap[1] = 整数
......
ap + sizeof(fmt) 表示跳过第一个字串指针变量。
*(int*)ap 表示输出第一个整数。
*((char**)ap) 虽然ap是一个char指针变量,但当它的值为字串指针变量时,即可转换成指针的指针变量。

之所以使用sizeof,是因为不同平台的指针大小不同,对于32平台是4个字节,对于64平台却是8个字节。

void var_args_func(const char * fmt, ... ) {
char *ap;

ap = ((char*)&fmt) + sizeof(fmt);/*只想问问这里为什么要 + sizeof(fmt) 难道这个&fmt不是4的首地址吗?*/
printf("%p ", ap);
printf("%d\n", *(int*)ap);

ap = ap + sizeof(int);
printf("%p ", ap);
printf("%d\n", *(int*)ap);

ap = ap + sizeof(int);
printf("%p ", ap);
printf("%s\n", *((char**)ap));
}

int main(){
var_args_func(&