¿É±ä²ÎÊýµÄCº¯Êý
(Ò»)дһ¸ö¼òµ¥µÄ¿É±ä²ÎÊýµÄCº¯Êý
ÏÂÃæÎÒÃÇÀ´Ì½ÌÖÈçºÎдһ¸ö¼òµ¥µÄ¿É±ä²ÎÊýµÄCº¯Êý.д¿É±ä²ÎÊýµÄ
Cº¯ÊýÒªÔÚ³ÌÐòÖÐÓõ½ÒÔÏÂÕâЩºê:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
vaÔÚÕâÀïÊÇvariable-argument(¿É±ä²ÎÊý)µÄÒâ˼.
ÕâЩºê¶¨ÒåÔÚstdarg.hÖÐ,ËùÒÔÓõ½¿É±ä²ÎÊýµÄ³ÌÐòÓ¦¸Ã°üº¬Õâ¸ö
Í·Îļþ.ÏÂÃæÎÒÃÇдһ¸ö¼òµ¥µÄ¿É±ä²ÎÊýµÄº¯Êý,¸Äº¯ÊýÖÁÉÙÓÐÒ»¸öÕûÊý
²ÎÊý,µÚ¶þ¸ö²ÎÊýÒ²ÊÇÕûÊý,ÊÇ¿ÉÑ¡µÄ.º¯ÊýÖ»ÊÇ´òÓ¡ÕâÁ½¸ö²ÎÊýµÄÖµ.
void simple_va_fun(int i, ...)
{
va_list arg_ptr;
int j=0;
va_start(arg_ptr, i);
j=va_arg(arg_ptr, int);
va_end(arg_ptr);
printf("%d %d\n", i, j);
return;
}
ÎÒÃÇ¿ÉÒÔÔÚÎÒÃǵÄÍ·ÎļþÖÐÕâÑùÉùÃ÷ÎÒÃǵĺ¯Êý:
extern void simple_va_fun(int i, ...);
ÎÒÃÇÔÚ³ÌÐòÖпÉÒÔÕâÑùµ÷ÓÃ:
simple_va_fun(100);
simple_va_fun(100,200);
´ÓÕâ¸öº¯ÊýµÄʵÏÖ¿ÉÒÔ¿´µ½,ÎÒÃÇʹÓÿɱä²ÎÊýÓ¦¸ÃÓÐÒÔϲ½Öè:
1)Ê×ÏÈÔÚº¯ÊýÀﶨÒåÒ»¸öva_listÐ͵ıäÁ¿,ÕâÀïÊÇarg_ptr,Õâ¸ö±ä
Á¿ÊÇÖ¸Ïò²ÎÊýµÄÖ¸Õë.
2)È»ºóÓÃva_startºê³õʼ»¯±äÁ¿arg_ptr,Õâ¸öºêµÄµÚ¶þ¸ö²ÎÊýÊǵÚ
Ò»¸ö¿É±ä²ÎÊýµÄÇ°Ò»¸ö²ÎÊý,ÊÇÒ»¸ö¹Ì¶¨µÄ²ÎÊý.
3)È»ºóÓÃva_arg·µ»Ø¿É±äµÄ²ÎÊý,²¢¸³Öµ¸øÕûÊýj. va_argµÄµÚ¶þ¸ö
²ÎÊýÊÇÄãÒª·µ»ØµÄ²ÎÊýµÄÀàÐÍ,ÕâÀïÊÇintÐÍ.
4)×îºóÓÃva_endºê½áÊø¿É±ä²ÎÊýµÄ»ñÈ¡.È»ºóÄã¾Í¿ÉÒÔÔÚº¯ÊýÀïʹ
Óõڶþ¸ö²ÎÊýÁË.Èç¹ûº¯ÊýÓжà¸ö¿É±ä²ÎÊýµÄ,ÒÀ´Îµ÷ÓÃva_arg»ñ
È¡¸÷¸ö²ÎÊý.
Èç¹ûÎÒÃÇÓÃÏÂÃæÈýÖÖ·½·¨µ÷ÓõĻ°,¶¼ÊǺϷ¨µÄ,µ«½á¹ûÈ´²»Ò»Ñù:
1)simple_va_fun(100);
½á¹ûÊÇ:100 -123456789(»á±äµÄÖµ)
2)simple_va_fun(100,200);
½á¹ûÊÇ:100 200
3)simple_va_fun(100,200,300);
½á¹ûÊÇ:100 200
ÎÒÃÇ¿´µ½µÚÒ»ÖÖµ÷ÓÃÓдíÎó,µÚ¶þÖÖµ÷ÓÃÕýÈ·,µÚÈýÖÖµ÷Óþ¡¹Ü½á¹û
ÕýÈ·,µ«ºÍÎÒÃǺ¯Êý×î³õµÄÉè¼ÆÓгåÍ».ÏÂÃæÒ»½ÚÎÒÃÇ̽ÌÖ³öÏÖÕâЩ½á¹û
µÄÔÒòºÍ¿É±ä²ÎÊýÔÚ±àÒëÆ÷ÖÐÊÇÈçºÎ´¦ÀíµÄ.
(¶þ)¿É±ä²ÎÊýÔÚ±àÒëÆ÷ÖеĴ¦Àí
ÎÒÃÇÖªµÀva_start,va_arg,va_endÊÇÔÚstdarg.hÖỶ¨Òå³ÉºêµÄ,
ÓÉÓÚ1)Ó²¼þƽ̨µÄ²»Í¬ 2)±àÒëÆ÷µÄ²»Í¬,ËùÒÔ¶¨ÒåµÄºêÒ²ÓÐËù²»Í¬,ÏÂ
ÃæÒÔVC++ÖÐstdarg.hÀïx86ƽ̨µÄºê¶¨Òåժ¼ÈçÏÂ('\'ºÅ±íʾÕÛÐÐ):
typedef char * va_list;
#define _INTSIZEOF(n) \
((sizeof(n)+sizeof(int)-1)&~
Ïà¹ØÎĵµ£º
Ñ¡ÔñÅÅÐò·¨ÀàËÆÎÒÃÇÈËΪµÄÅÅÐòÏ°¹ß£º´ÓÊý¾ÝÖÐÑ¡Ôñ×îСµÄͬµÚÒ»¸öÖµ½»»»£¬ÔÚ´ÓʡϵIJ¿·ÖÖÐÑ¡Ôñ×îСµÄÓëµÚ¶þ¸ö½»»»£¬ÕâÑùÍù¸´ÏÂÈ¥……
Ñ¡ÔñÅÅÐòµÄƽ¾ùʱ¼ä¸´ÔӶȱÈðÅÝÅÅÐòµÄÉÔµÍ:
ͬÑùÊý¾ÝµÄÇé¿öÏ£¬2ÖÖËã·¨µÄÑ»·´ÎÊýÊÇÒ»ÑùµÄ£¬µ«Ñ¡ÔñÅÅÐòÊÇÒ»¶Ô¶àµÄ±È½Ï£¬Ã¿ÌËÖ»½øÐÐ0µ½1´Î½»»»£¬¶øðÅÝÅÅÐòÊÇÏàÁÚÁ½Á½±È½Ï£ ......
CÖвÉÓÃÁ˲»Í¬µÄµ÷Ó÷½Ê½À´µ÷Óú¯Êý£¬ÕâÀïµÄº¯Êýµ÷ÓøÅÄî¿ÉÄÜÓëÎÒÃÇͨ³£ËùÀí½âµÄº¯Êýµ÷ÓÃÓÐËù²»Í¬£¬ËüÃÇÖ¸µÄÊÇ´¦ÀíÆ÷ÔÚ´¦Àíº¯ÊýÉϵIJîÒì¡£Àí½âÕâЩ²»Í¬µÄ·½Ê½ÓÐÖúÓÚÎÒÃÇÀ´µ÷ÊÔ³ÌÐòºÍÁ´½ÓÎÒÃǵĴúÂë¡£ÔÚ´ËÎÒÏëÌÖÂÛÒ»ÏÂÖ÷ÒªµÄËÄÖÖº¯Êýµ÷Ó÷½·¨ÒÔ¼°Ö®¼äµÄÇø±ð£¬ËüÃÇÊÇ__stdcall¡¢__cdecl¡¢__fastcall¡¢thiscall¡£µ±È»£¬»¹ÓÐһР......
×î½üʵÔÚÊÇ̫æÁË£¬ÕâƪÕûÕû¾ÍÍƳÙÁË1¸öÔÂÁË£¬ÊµÔÚÊǶԲ»Æð¡£Ö®Ç°±¾´òËãÕâ¸öÄ£¿é¾Í½áÊøÁË£¬Îļþ²Ù×÷¾Í²»Ð´ÁË£¬µ«ÊÇÎļþ²Ù×÷ÓÖÊÇÒ»¸öºÜÖØÒªµÄ¶«Î÷£¬¶øÇÒÒ²¸ÕºÃÄܹ»×ܽá֮ǰÎÒÃÇѧϰµÄËùÓÐ֪ʶ¡£Í¬Ê±Ò²ÎªÁ˽«Îļþ²Ù×÷Õâ¸ö³õѧÕßÈÏΪºÜÉñÃصĶ«Î÷¸ø±¾ÖÊ»¯¡£Òò´Ë£¬±¾Æª½«ÖðÒ»½éÉÜCÓïÑÔµÄÎļþ²Ù×÷¡££¨±¾Ä£¿éµÄÃüÃû±¾À´ÊÇÏëC\C++Ò ......
½ñÌì×ßÉÏ·ÉÏͻȻÓижø·¢£¬ÎÒÃÇÀÏʦһֱ¸øÎÒÃǽ²Òª´ÓC/SתÏòB/S£¬µ«ÊÇÎÒ¾õµÃʲôÊÇC/S£¬Ê²Ã´ÊÇB/S£¿Æäʵ¶¼ÊÇ¿Í»§»ú·þÎñÆ÷ģʽ°É£¡ÒÔÇ°¸ù±¾Ã»ÓÐB/SµÄ¸ÅÄ¶øÈç½ñÕâ¸öB/SµÄ¸ÅÄîÔõô±äµÃÈç´ËµÄ¿äÕÅ£¬ä¯ÀÀÆ÷Ã÷Ã÷¾ÍÊÇÒ»¸ö¿Í»§¶ËÈí¼þ£¬Ö»ÊÇ°ÑÄÇЩ¹æ·¶ºÃµÄÎı¾Òë³É¸÷ÖÖ¸÷ÑùµÄ¸ñʽ£¬Ö»ÊÇ´ó¼Ò¶¼×ñÑÁËÕâÑùµÄÒ»¸ö¹æ¶¨¾Í±ä³ÉÁËÁíÒ»ÖÖ ......
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
´ËÌâ×îºóµÄ½á¹ûÊÇ8£¬8.
Õ§¿´½á¹ûÓ¦¸ÃÊÇ7ºÍ8¡£
ÔÀí£º
ÒòΪËüÃÇ×÷ΪprintfµÄ²ÎÊý£¬º¯Êýprintf´Ó×óÍùÓÒ¶ÁÈ¡£¬È»ºó½«ÏȶÁÈ¡·Åµ½Õ»µ×£¬×îºó¶ÁÈ¡µÄ·ÅÔÚÕ»¶¥£¬´¦ÀíʱºòÊÇ´ÓÕ»¶¥¿ªÊ¼µÄ£¬ËùÓÐÎÒÃÇ¿´¼ûµÄ½á¹ûÊÇ£¬´ÓÓұ߿ªÊ¼´¦ÀíµÄ¡£ ......