2013-04-03 35 views
3

有人可以解釋這個問題在這裏發生了什麼?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:我搜索了一下,但不幸找不到任何東西。

+5

您已將其複製錯誤;它應該是'void(* ptr [2])()= ...'。 – ecatmur

+0

可能重複[如何理解複雜的函數聲明?](http://stackoverflow.com/questions/1448849/how-to-understand-complicated-function-declarations) – user93353

回答

7

你是指我該怎麼讀這個

你丟棄從原來的答案了一些有用的背景下,讓我們修復:

void print(); 
void exitme(); 

int main() { 
    void (*p[2])()={print,exitme}; 

所以現在很明顯,printexitme功能。 具體而言,它們都返回void並且不接受參數,所以它們共享的函數指針類型

void (*)() 

(即,該類型的一個函數指針可以指向要麼printexitme或)。例如,現在

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]; 
7

這只是一個帶有兩個元素的函數指針數組 - ptr[0]指向函數blah()ptr[1]指向函數blah2()

可以調用每個函數是這樣的:

(ptr[0])(); // call blah() 

(ptr[1])(); // call blah2() 
+0

嗯,嗯,我到目前爲止,但我試圖得到的是,我們可以只是說這些函數像變量一樣存儲在內存中,並且因爲這兩個函數都是'void's,所以我們可以創建兩個'void'指針指向這個「地方」功能存儲在哪裏? –

+1

不 - 它們不是指向void *的指針,它們是指向返回void的函數的指針(或者,如果您在複製代碼時沒有犯錯,它應該是void(* ptr [ 2])()= {blah,blah2};' - 注意你問題中缺少的括號)。 –

2
void(*ptr[2])() 

聲明函數指針,其中blahblah2是被指出的功能的陣列。 在這種情況下,指向的函數必須具有void作爲「返回類型」(即它們不得返回任何內容),並且不得有任何參數(由於聲明末尾的())。

鏈接到的示例代碼,使用這些函數指針是打印的i值或退出應用程序(當i = 100和i/100結果在1,它是所述第二陣列元件)

作爲例子顯示,你可以使用函數liek這個調用函數:

i = 0; // or 1 (as your array has a size of 2) 
(ptr[i])(); 

注:例如可以考慮非常不好的做法,所以請不要使用它,而不是一個簡單的for -loop的! :)

2

這就是將ptr聲明爲兩個函數指針的數組,並初始化它們以分別指向blah()blah2()這兩個函數。

需要括號來防止它成爲void *(void指針)的聲明,這將是別的。

2

這是一組function-pointers。您正在使用兩個函數blahblah2的地址初始化它。

1

ptr是指向不返回任何值且沒有參數的函數的指針數組。

一般而言,ptr[1]正在調用exitme函數,該函數調用exit(1)ptr[0]調用處理打印的函數。變量i是靜態的,所以當程序退出時它的使用結束。

在第一次迭代中,有分配給指向exitmeprint和功能兩個指針的數組的新存儲塊(實際上是在每次迭代中,這樣做是不與i喜歡)。然後,一個靜態變量i聲明並(在ansi-c肯定)初始化爲零,後來被稱爲第一個函數(print),因爲i++/1000.001但它等於0(因爲既不是投已經完成,也沒有他們float)和同時i正在增加。調用print和印刷i價值後,我們再次呼籲main這個不斷迭代,直到i到達100

請注意,有兩個靜態整數i,但每個人都有不同的適用範圍,因此,他們有不同的值。

因此,您可以在不使用循環的情況下打印1 ... 100。

相關問題