目錄
- 傳統藝能😎
- 過渡區🤣
- 正片開始👀
- 可變引數👏
- 宏觀程序👏
- 原理👏
- 格局打開👏
傳統藝能😎
小編是大一菜鳥不贅述,歡迎大佬指點江山(QQ:1319365055)
此前博客點我!點我!請搜索博主 【知曉天空之藍】
喬喬的gitee代碼庫(打灰人 )歡迎訪問,點我!
過渡區🤣
現在是北京時間13:15,期末考試結束,明天卷鋪蓋回家嘍!yysy,算見識了嘛是卷翻天,博客之星20s沒見就給降了一名,睡一覺起來各位都是一萬多總分,淚,6 了下來,我放假了各位,鍵盤不爛我不睡好吧

正片開始👀
可變引數👏
可變引數是C語言提供的一種引數可變的機制,咱希望函式帶有可變數量的引數,而不是預定義數量的引數,它允許咱定義一個函式,能根據具體的需求接受可變數量的引數,比如這種:
int Max(int num,...)
{
va_list arg;
va_start(arg,num);
int max = va_arg(arg,int);
for(int i = 1;i<num;i++)
{
int sid = va_arg(arg,int);
}
if(sid > max)
{
max = sid;
}
va_end(arg);
return max;
}
int main()
{
int a = Max(5,1,2,3,4,5);
printf("%d\n",a);
return 0;
}
如上形式Max函式就用到了可變引數,注意!使用可變引數時,Max內首元素 ‘ 5 ’代表元素個數

那么問題來了,如果函式沒有形式引數,可以給函式傳遞嗎?答案是可以的,在C語言中,只要發生了函式呼叫并呼叫了引數,必定會形成臨時變數;所謂臨時拷貝(變數)的本質,也就是在堆疊幀內部形成的(從右向左形成臨時拷貝(變數)).
宏觀程序👏
va_list定義了可以訪問可變引數部分的變數,他的本質是一個 char 型別指標,va_start 使 b 指向可變引數部分,va_end 是用來完成收尾作業的,本質就是將引數arg置為空,避免野指標,
掐頭去尾,我們看看主體部分,首先 arg 指標先讓我的資料入堆疊,我們打開反匯編能看到堆疊頂 esp 位置,再在記憶體視窗找到 esp 位置,就會看到這個經典的一幕,倒著入堆疊連著幾個資料入堆疊是壓在一起的,這種結構對我們查找元素就非常友好了,

宏觀的框架就是我們傳入的變數 num 就代表第一個引數 5,va_start 就是讓 arg 原本指向5的 ,再讓他指向有效部分,比如 1,根據指向 1 的起始地址, va_start 指向他的可變部分(去掉已指向的有效部分),具體如何實作見下文;最后 va_arg 就是根據型別 int ,從起始地址開始連續讀取找到某一個元素,這樣最侄訓把所需要的 max 的值讀出來,
原理👏
可變引數串列對應的函式,最終呼叫也是函式呼叫,也要形成堆疊幀,堆疊幀形成前,臨時變數會先入堆疊,根據咱之前總結的,引數位置都是相對固定的;在可變引數中 ,如果是短整型,一般都要進行整型提升,比如引數傳入的是 char 型別,但實際傳出的是 int 型別,這就是我們的 va_arg(arg,int)為什么是 int 而不是 char,所以在 va_arg 中指定了錯誤的型別,那結果無法預測,
要注意:
1.可變引數必須從頭到尾逐個進行訪問,如果你訪問了幾個可變引數后想半途而廢,是可以做到的,但如果一開始就想訪問中間某個元素的話,噠咩!
2.引數串列中至少有一個命名引數,如果連一個引數都沒有,就沒辦法使用 va_start;
3.這些宏是沒辦法直接判斷實際存在的引數數量的,也無法判斷每個引數的型別
格局打開👏
#define _crt_va_start(ap,v) (ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v)
#define _crt_va_arg(ap,t) (*(t*)((ap += _INTSIZEOF(t) - _INTSIZEOF(t))
#define _crt_va_start(ap) (ap = (va_list)0)
)
談完原理就要談原理的原理,這段宏定義的預處理就給出了他的運作原理,ap 就相當于 arg, v 就相當于變數 num,va_list 相當于 char *,這里 ADDRESS 相當于取地址,所以就是在對 char 指標強轉之后,此時就有了一個指標以一位元組為單位,指向入堆疊的第一個有效元素,要想繼續指向后面可變部分,就要繼續向下移動四個位元組,加上他本身大小就能移動到可變部分,
今天就先到這里,摸了家人們,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/397418.html
標籤:其他
上一篇:Navicat15安裝筆記
下一篇:R語言自定義多分類混淆矩陣可視化函式(mutlti class confusion matrix)、R語言多分類混淆矩陣可視化
