c語言中如何?可變參數

來源:互聯網
上載者:User

標籤: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語言中如何?可變參數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.