有人可以解釋這個問題在這裏發生了什麼?C programming - void(* ptr [2])()= {blah,blah2};解釋
Print 1 to 100 with out loop and conditions in C
什麼是理論或可能的低級別的解釋
void(*ptr[2])() = {blah, blah2};
我是新的C,我想知道這是怎麼回事;)
提前致謝。
P.S:我搜索了一下,但不幸找不到任何東西。
有人可以解釋這個問題在這裏發生了什麼?C programming - void(* ptr [2])()= {blah,blah2};解釋
Print 1 to 100 with out loop and conditions in C
什麼是理論或可能的低級別的解釋
void(*ptr[2])() = {blah, blah2};
我是新的C,我想知道這是怎麼回事;)
提前致謝。
P.S:我搜索了一下,但不幸找不到任何東西。
你是指我該怎麼讀這個?
你丟棄從原來的答案了一些有用的背景下,讓我們修復:
void print();
void exitme();
int main() {
void (*p[2])()={print,exitme};
所以現在很明顯,print
和exitme
指功能。 具體而言,它們都返回void並且不接受參數,所以它們共享的函數指針類型
void (*)()
(即,該類型的一個函數指針可以指向要麼print
exitme
或)。例如,現在
void (*print_or_exit)() = (rand() % 2) ? print : exitme;
print_or_exit(); // who knows what it will do!
,其中兩個函數指針數組的樣子:
void (*ptr[2])()
,可以初始化爲:所以現在我們可以重寫我們的愚蠢
void (*ptr[2])() = { print, exitme };
例如:
void (*print_or_exit)() = ptr[rand() % 2];
這只是一個帶有兩個元素的函數指針數組 - ptr[0]
指向函數blah()
和ptr[1]
指向函數blah2()
。
可以調用每個函數是這樣的:
(ptr[0])(); // call blah()
(ptr[1])(); // call blah2()
嗯,嗯,我到目前爲止,但我試圖得到的是,我們可以只是說這些函數像變量一樣存儲在內存中,並且因爲這兩個函數都是'void's,所以我們可以創建兩個'void'指針指向這個「地方」功能存儲在哪裏? –
不 - 它們不是指向void *的指針,它們是指向返回void的函數的指針(或者,如果您在複製代碼時沒有犯錯,它應該是void(* ptr [ 2])()= {blah,blah2};' - 注意你問題中缺少的括號)。 –
void(*ptr[2])()
聲明函數指針,其中blah
和blah2
是被指出的功能的陣列。 在這種情況下,指向的函數必須具有void
作爲「返回類型」(即它們不得返回任何內容),並且不得有任何參數(由於聲明末尾的()
)。
鏈接到的示例代碼,使用這些函數指針是打印的i
值或退出應用程序(當i
= 100和i/100
結果在1,它是所述第二陣列元件)
作爲例子顯示,你可以使用函數liek這個調用函數:
i = 0; // or 1 (as your array has a size of 2)
(ptr[i])();
注:例如可以考慮非常不好的做法,所以請不要使用它,而不是一個簡單的for
-loop的! :)
這就是將ptr
聲明爲兩個函數指針的數組,並初始化它們以分別指向blah()
和blah2()
這兩個函數。
需要括號來防止它成爲void *
(void指針)的聲明,這將是別的。
這是一組function-pointers
。您正在使用兩個函數blah
和blah2
的地址初始化它。
ptr
是指向不返回任何值且沒有參數的函數的指針數組。
一般而言,ptr[1]
正在調用exitme
函數,該函數調用exit(1)
和ptr[0]
調用處理打印的函數。變量i
是靜態的,所以當程序退出時它的使用結束。
在第一次迭代中,有分配給指向exitme
print
和功能兩個指針的數組的新存儲塊(實際上是在每次迭代中,這樣做是不與i
喜歡)。然後,一個靜態變量i
聲明並(在ansi-c
肯定)初始化爲零,後來被稱爲第一個函數(print
),因爲i++/100
是0.001
但它等於0
(因爲既不是投已經完成,也沒有他們float
)和同時i
正在增加。調用print
和印刷i
價值後,我們再次呼籲main
這個不斷迭代,直到i
到達100
請注意,有兩個靜態整數i
,但每個人都有不同的適用範圍,因此,他們有不同的值。
因此,您可以在不使用循環的情況下打印1 ... 100。
您已將其複製錯誤;它應該是'void(* ptr [2])()= ...'。 – ecatmur
可能重複[如何理解複雜的函數聲明?](http://stackoverflow.com/questions/1448849/how-to-understand-complicated-function-declarations) – user93353