標籤:c c++ 棧 可變參數 記憶體
c語言函數庫中有不少類似於printf,scanf的函數,這些函數接收的參數個數是不確定的。這些函數實際是通過<stdarg.h>檔案中的va_list,va_start,va_arg,va_end宏定義是實現的。另外,我們知道程式運行時的記憶體結構後,也可以通過直接存取這些記憶體空間獲得實際參數值(事實上stdarg.h檔案中的相關宏定義就是這麼操作的)。
#include <stdio.h>#include <stdlib.h>#include <stdarg.h>int sum1(int nums);int sum2(int nums);int main(){int result1 = 0;int result2 = 0;result1 = sum1(5, 1, 2, 3, 4, 5);result2 = sum2(5, 1, 2, 3, 4, 5);printf("result1 is %d\n",result1);printf("result2 is %d\n",result2);system("pause");}//棧是從高地址到低地址生長的,c語言中函數參數是從右向左依次入棧的//c語言中入棧出棧是由函數調用者決定的(_ccall)//c++中入棧出棧是由函數本身負責的(_stdcall),c++中也支援可變參數,//但需要需要聲明為int sum1(int nums,...)形式int sum1(int nums){int result = 0;int *argptr = &nums;//獲得參數nums的地址for (int i = 0; i < nums; i++)result += *(++argptr);return result;}//利用<stdarg.h>中的va_list,va_start,va_end,va_arg宏定義實現int sum2(int nums){int result = 0;va_list argptr;va_start(argptr,nums);for (int i = 0; i < nums; i++)result += va_arg(argptr, int);va_end(argptr);return result;}
程式運行結果如下
c語言中如何?可變參數