本文目錄一覽:
c語言 怎麼寫 可變 參數函數
#include stdarg.h //可變參數函數必要的頭文件
#include stdio.h
long int sum(unsigned int argc,…) //可變參數函數必須包含至少一個確定的參數
{
long int srt=0;
int va;
unsigned int i;
va_list vl; //用於指向可變參數列表
va_start(vl,argc); //初始化,va_start()調用的第一個參數是所編寫的可變參數函數的最後一個確定的參數
for (i = 0; iargc; i++) {
srt+=(int)va_arg(vl,int); //從參數列表按提取一個int類型的值參與相加運算
}
va_end(vl); //清理
return srt;
}
int main(int argc, char* argv[])
{
printf(“%ld\n”,sum(3,1,2,3));
return 0;
}
c語言中函數可否改變參數值
#include
void
foo(int
x,
int
y,
int
z)
{
printf(”x
=
%d
at
[%x]n”,
x,
x);
printf(”y
=
%d
at
[%x]n”,
y,
y);
printf(”z
=
%d
at
[%x]n”,
z,
z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
運行結果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數參數入棧順序的確是從右至左的。可到底為什麼呢?查了一直些文獻得知,參數入棧順序是和具體編譯器實現相關的。比如,pascal語言中參數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual
c++.即然兩種方式都可以,為什麼c語言要選擇從右至左呢?
進一步發現,pascal語言不支持可變長參數,而c語言支持這種特色,正是這個原因使得c語言函數參數入棧順序為從右至左。具體原因為:c方式參數入棧順序(從右至左)的好處就是可以動態變化參數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的參數被壓在棧底。除非知道參數個數,否則是無法通過棧指針的相對位移求得最左邊的參數。這樣就變成了左邊參數的個數不確定,正好和動態參數個數的方向相反。
因此,c語言函數參數採用自右向左的入棧順序,主要原因是為了支持可變長參數形式。換句話說,如果不支持這個特色,c語言完全和pascal一樣,採用自左向右的參數入棧方式
c語言可變參數是幹什麼的
可變參數是用於調用函數時,不知道參數的個數及類型的一種場合,最經典最常用的是
int
printf(const
char
*format[,
argument,
…]);
它後面的參數類型及數量都是可變的
如
printf(“%d”,x);
//一個int參數
printf(“%d%d%s\n”,x,y,z);
//三個參數,前兩個為int,後面的為char
*
原創文章,作者:EFIJ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/135379.html