2016-12-04 67 views
1
#include<stdio.h> 
int func(int*); 
int main(void) 
{ 
     int a = 3; 
     int *p = NULL; 
     p = &a; 
     printf("p = %p\n", p); 
     func(p); 
     printf("p inc: %p\n", p); 
     return 0; 
} 
int func(int *p) 
{ 
     p++; 
     return 0; 
} 

輸出:P = 0x7fff6f87e89c p INC:0x7fff6f87e89c傳遞指向函數的指針不是通過C中的引用傳遞的?

指針P被傳遞給函數func和指針p遞增在FUNC,但在主要的功能其地址仍然是相同的!!傳遞指向函數的指針不是通過引用傳遞的?

+4

注:沒有**通通過在C參考**。 –

+0

你想增加'主'的'a'或'主'的'P'嗎? – alk

+0

我只想檢查指針的地址,我在函數func()中增加指針的地址,想檢查它是否反映在main()中 –

回答

1

您增加指針,而不是值。

嘗試這樣

(*p)++; 

而且

printf("p inc: %d\n", *p); 

您需要了解的指針。指針只是一個存儲數據實際存儲地址的變量。您可以通過使用解引用運算符*來訪問數據,因此如果要更改數據,只需解除引用指針,然後修改數據即可。

同樣,對於打印,您希望看到數據的值。

在你的代碼中,你只能修改指針。在c中,你總是按值傳遞,指針本身的拷貝是在func()函數中創建的,最初它與最初的指針保持相同的地址,但由於它是一個副本,所以增加它只會影響本地副本中的地址。

此外,它指向堆棧上的變量。對它的增量操作將導致一個指針,你不能解引用,因爲它會是未定義的行爲。

如果你想增加指針的地址,您需要將指針傳遞到指針,這樣

void func(int **p) 
{ 
    (*p)++; 
} 

,並在主

func(&p); 

注意的func()身體是一樣的,因爲你再次需要訪問p指向的內存以修改它。

+0

建議您擺脫「虛擬」和腳註。 C有* no *虛擬和物理內存的概念。 – paxdiablo

1

在C中沒有引用的傳遞。當你傳遞一個函數的指針時,你正在傳遞一個內存地址的值。

時,裏面的功能,你這樣做:

int func(int *p) 
{ 
    p++; 
    return 0; 
} 

...你只通過遞增字節sizeof *p由參數p指定的內存地址。

爲了在C中通過引用「模擬」段落,您需要顯式取消引用指針以訪問實際對象。如果p正確分配且有效的指針,則*p是它指向的對象。如果非指針表達是這樣的:

a = a + 1; 

...然後用p == &a它會成爲這樣:

*p = *p + 1; 

...或者乾脆(*p)++。請注意,括號是必要的,否則,C會將其讀作*(p++)。您也可以習慣寫++*p

2

指針按值傳遞。
如果你想通過引用傳遞指針,你只需傳遞一個指針的指針!

像這樣:

#include<stdio.h> 
int func(int**); 
int main(void) 
{ 
    int a = 3; 
    int *p = NULL; 
    p = &a; 
    printf("p = %p\n", p); 
    func(&p); 
    printf("p inc: %p\n", p); 
    return 0; 
} 
int func(int **p) 
{ 
    (*p)++; 
    return 0; 
} 
+2

差不多。您仍然按照價值傳遞指針。唯一改變的是指針指向的對象的類型。 – giusti