我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:澳门银河总站登录网站,澳门银河网站检测7163 > 变参 >

c语言可变参数指针实现有对么?

归档日期:11-24       文本归类:变参      文章编辑:爱尚语录

  C语言的可变参数书本上要用到这3个宏(初始化,寻找下一个,结束)宏va_arg()、va_start()和va_end()这几个宏我觉得没有必要。。。。。不知道对不对啊。原因如下:1:可变参数必须在固...

  C语言的可变参数 书本上要用到这3个宏(初始化,寻找下一个,结束)宏va_arg()、va_start()和va_end()

  通过固定参数提供的变参的个数或者约定的符号、值 确定 每一个或最后一个 变参的位置,结束循环.

  如果通过固定参数提供的变参的个数或者约定的符号、值确定 每一个或最后一个 变参的位置,

  如果我通过指针的地址 ++ 运算不是可以直接而且快捷的访问每个变参的值么?何必要用上面的3个宏呢?

  //固定参数 a1, 可变参数的地址就在a1后面(都是堆栈),约定后面参数都是int ,最后一个为0

  这样不是更方便么?而且这个函数里面的变量、指针都是局部作用域,函数结束自动就消失了呀!

  上面的3行 我 只能看懂语法上的基本意思(怎么执行的) 但不太理解为什么要这样做?地址的移动不就是数据类型+偏移地址么? 为何上面前3行如此复杂?展开我来答

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  试想,一个对C语言函数调用过程还不太了解的编写者,通过使用这些宏就可以轻易编写出使用不定参数的函数(而且在不同平台上都能正常运行),但是直接使用指针的话,就需要考虑很多东西,比如参数在栈里的排列顺序,还有类型提升规则等(比如float参数会自动转换为double类型),这样就加大了编写难度,而不是像你说的“更方便”,而且你这样写,在另外一个架构不同的平台上可能就无法正常运行了。

  C语言虽然以“接近底层”而闻名,但还是对底层进行了一定抽象,比如stdio.h就是对底层输入输出进行了抽象,方便用户使用。追问您看我下我改的补充 我不太理解!谢谢!追答首先要明白C语言参数传递的机制。

  我只介绍x86平台上的,其他平台我也不了解。x86平台上,栈的增长方向是从高到低的,也就是说后入栈的元素的地址比先入栈的元素地址低。其次,栈的元素大小是固定的,在32位平台上,一个元素的大小是4字节(也就是一个int型变量的大小)。

  C语言调用函数时,参数是从右往左入栈的,像printf(%d%d,1,2)这样的函数,是先把参数2入栈、再把1入栈,最后把%d%d入栈。这样%d%d、1、2三个参数就会按地址从低到高排列。由于栈中一个元素是4字节,所以对于char、short,需要提升为int型再入栈(对于double型参数,是把它拆分成两个元素入栈的)。

  _INTSIZEOF这个宏,就是把char、short这些大小小于4字节的参数提升为4字节。然后va_arg宏就可以正确地从栈中取出参数。

  展开全部这个不就

本文链接:http://judhitmills.com/biancan/66.html