2014-09-21 65 views
0

我有以下代碼:基本函數指針誤解

#include <stdio.h> 
#include <conio.h> 

int fun1 (int); 
int fun2 (int); 
int fun3 (int); 

int (*fun4) (int) = fun1; // 1 

void main() 
{ 
    int (*fun4) (int) = fun2; // 2 
    printf ("%d\n", fun4(3)); 
    printf ("%d\n", fun3(3)); 
    getch(); 
} 

int fun1 (int x) 
{ 
    return x+1; 
} 

int fun2 (int x) 
{ 
    return 2*x; 
} 

int fun3 (int x) 
{ 
    return fun4(x); 
} 

它產生的輸出:

6 
4 

我不知道爲什麼發生這種情況。

在寫入// 2的行處,我們定義fun4指向fun2。所以從那時起,當我寫fun4(x)就像寫fun2(x)一樣。我不知道爲什麼第二次打印產量爲4.

任何人都可以解釋爲什麼發生這種情況?

+3

有兩種不同的fun4。 – 2014-09-21 17:16:37

回答

2

所以從那時起,當我寫fun4(x)就像寫fun2(x)一樣。我不知道爲什麼第二次印刷產量4.

int (*fun4) (int) = fun2; // 2 

只是main範圍內可見。 fun4只在main內指向fun2main的範圍fun4之外是指向fun1的指針。
當你調用fun3fun4(x)那麼就相當於fun1(x)

+0

啊我明白了。所以如果我有另一個使用fun4的main之外的程序,它將等同於fun1? – 2014-09-21 17:18:56

+0

@OriaGruber;是。 – haccks 2014-09-21 17:19:28

1

在你的例子fun3調用fun4fun3的定義不知道任何關於本地fun4變量。爲了清楚起見,賦值fun2 = fun4是一個指針賦值,而不是名稱賦值。當你調用這個函數時,它不會按名稱搜索它,而只是通過指針來搜索它,並且指定的指針是指向fun1的指針。

1

你有fun4兩種定義一個是局部的,另一個是全球性的。 如果我們更換的fun4代碼的定義是這樣的:

#include <stdio.h> 
#include <conio.h> 

int fun1 (int); 
int fun2 (int); 
int fun3 (int); 

int (*fun4) (int) = fun1; // 1 (global definition) 

void main() 
{ 
    int (*fun4) (int) = fun2; // 2 (local definition) 
    printf ("%d\n", fun2(3)); //! Since fun4(local) pointing to fun2 
    printf ("%d\n", fun3(3)); 
    getch(); 
} 

int fun1 (int x) 
{ 
    return x+1; 
} 

int fun2 (int x) 
{ 
    return 2*x; 
} 

int fun3 (int x) 
{ 
    return fun1(x); //! Since fun4(global) pointing to fun1 
} 

注:請參考意見,以使更改

0

如果你改變你這樣的代碼:

int (*fun4) (int) = fun1; // 1 

void main() 
{ 
    fun4 = fun2; // 2 
    printf ("%d\n", fun4(3)); 
    printf ("%d\n", fun3(3)); 
    getch(); 
} 

然後它會按照您的預期行事。該更改位於標記爲// 2的行上。它不會在本地範圍聲明一個名爲fun4的變量,而會爲現有的全局fun4分配一個不同的值。