2010-09-26 262 views
20

我對傳遞指針的工作原理有些困惑。C++將指針傳遞給函數(Howto)+ C++指針操作

比方說,我有以下功能和指針,...

編輯

...我想用一個指向某個對象作爲函數的參數。

即:

void Fun(int Pointer){ 
    int Fun_Ptr = ---Passed Pointer---; 
    //So that Fun_Ptr points to whatever ---Passed Pointer points to 

的*指針和&指針符號之間,我很迷茫。我知道*指針指的是指向它的任何東西。

我是否在聲明中使用了void(int *指針)。當我使用該功能時呢?

您的幫助表示讚賞。

編輯2:

好的,我現在明白,使用在*聲明變量意味着一個指針將被傳遞。但是,當我使用該功能呢?

int main(){ 
    int foo; 
    int *bar; 
    bar = foo; 
    Fun(bar); 
} 

編輯3: 好了,糾正我,如果我錯了:

根據上面的代碼中的約定:

欄= & FOO手段:使條指向內存中的foo

* bar = foo表示更改t他珍視杆指向等於任何FOO等於

如果我有一個第二指針(INT * OOF),則:

巴= OOF指:巴指向OOF指針

巴= * OOF指:巴指向值OOF點,但不與OOF指針本身

*巴= * OOF是指:該棒積分值更改爲到值OOF指向

& bar = & oof表示:將條指向的內存地址改爲與指向的內存地址相同

我有這個權限嗎?

編輯4:非常感謝所有的幫助(我希望我可以接受1個以上的答案,但我必須要接受第一個答案,我不確定社區wiki是如何工作的,但我會離開用這種方式進行編輯(如果你願意,可以隨意將它變成一個參考指南)。

+0

您的第二次編輯幾乎是正確的,但是 – Tomas 2010-09-26 01:13:46

+0

「這是否正確?」。不,你不希望'bar'等於*到'foo',你希望它指向*'foo'。這是通過操作員的地址完成的。 'bar = &foo;'。 – 2010-09-26 01:14:38

+0

bar = foo,是無效的,因爲foo是一個int和bar指針。正確的代碼是「bar =&foo」,因爲作爲指針,bar只能存儲內存地址而不是int。對評論的答案抱歉。 – Tomas 2010-09-26 01:14:49

回答

39

有一個在*用途的差異,當你要定義一個變量,當你使用它。

在聲明,

int *myVariable; 

指指針的整數數據類型。然而,在使用,

*myVariable = 3; 

手段順從的指針,並使其在同等指向三個結構,而不是使指針等於內存地址0X 0003

所以在你的函數,你要做到這一點:

void makePointerEqualSomething(int* pInteger) 
{ 
    *pInteger = 7; 
} 

在函數聲明,*意味着你傳遞一個指針,但在其實際的代碼體*意味着你正在訪問哪些指針所指向。

在試圖一波帶走您有任何困惑,我將簡要地進入符號(&)

&手段得到的東西的地址,在計算機上存儲的確切位置,所以

int & myVariable; 

在聲明中意味着整數或指針的地址!

然而,這

int someData;  
pInteger = &someData; 

手段使pInteger指針本身(記住,指針是他們點什麼的只是內存地址)等於「someData」地址 - 所以現在pInteger會在某個數據點,並且可以在您遵守時訪問它:

*pInteger += 9000; 

這對您有意義嗎?還有什麼你覺得困惑?

@ EDIT3:

接近正確的,除了三個語句

bar = *oof; 

意味着該棒形指針等於一個整數,不是酒吧點,這是無效的。

&bar = &oof;

的符號就像一個功能,一旦它返回您不能修改它是從哪裏來的內存地址。就像這樣的代碼:

returnThisInt("72") = 86; 

無效,你的也是。

最後,

bar = oof 

不是說「棒指向OOF指針」這意味着,酒吧指向地址OOF點,所以酒吧點到任何FOO所指向 - 不會吧指向指向oof的foo。

+0

好吧,這是否意味着pInteger指針指向someData指針? – Biosci3c 2010-09-26 01:14:28

+1

我應該澄清,someData不是一個指針,它是一個原始的int。我已經適當地編輯了我的答案。 &符號現在對你有意義嗎? – Tomas 2010-09-26 01:15:58

+0

好吧,我想我有點失望了(指針總是讓我困惑,我真的很難理解它們)。我想我現在對它有相當好的把握。 – Biosci3c 2010-09-26 01:17:32

-1

你可能會更容易理解使用Functionoids,它們的表現更整潔,功能更強大,請參閱此優秀且強烈推薦的C++ FAQ lite,特別是請參閱第33.12節,但從最初開始閱讀那部分要獲得它的把握和理解。

要回答你的問題:

typedef void (*foobar)() fubarfn; 

void Fun(fubarfn& baz){ 
    fubarfn = baz; 
    baz(); 
} 

編輯:

  • &指參考地址
  • *意味着什麼包含在參考地址的值,稱爲去參考

因此,使用下面的示例中的引用,表明我們正在傳入一個參數,並直接對其進行修改。

void FunByRef(int& iPtr){ 
    iPtr = 2; 
} 

int main(void){ 
    // ... 
    int n; 
    FunByRef(n); 
    cout << n << endl; // n will have value of 2 
} 
+0

也許我應該澄清。我不是試圖使用指向函數的指針,而是將一個指針傳遞給函數的某個對象(比如說一個int),以便函數可以對它執行操作。我會修改我的問題來澄清這一點。 – Biosci3c 2010-09-26 01:06:59

1
void Fun(int *Pointer) 
{ 
    //if you want to manipulate the content of the pointer: 
    *Pointer=10; 
    //Here we are changing the contents of Pointer to 10 
} 

*之前的指針裝置的指針的指針(或任何變量)前的內容(除了在聲明!)

&意味着該地址

編輯:

int someint=15; 
//to call the function 
Fun(&someint); 
//or we can also do 
int *ptr; 
ptr=&someint; 
Fun(ptr); 
+0

這是C語法,當OP明確指定C++ .... – t0mm13b 2010-09-26 01:16:38

+0

@ tommieb75:它爲什麼有效C?它也是C++語法,提問者沒有指定「C++,C被刪除」。無論如何。 – 2010-09-26 01:43:15

3

要傳遞一個int指針,它應該是void Fun(int* pointer)

傳遞到一個int的引用是這樣的......

void Fun(int& ref) { 
    ref = 10; 
} 

int main() { 
    int test = 5; 
    cout << test << endl; // prints 5 

    Fun(test); 
    cout << test << endl; // prints 10 because Fun modified the value 

    return 1; 
} 
3

如果你想一個指針到INT傳遞到你的函數,

宣言的功能(如果需要的話):

void Fun(int *ptr); 

的功能定義:

void Fun(int *ptr) { 
    int *other_pointer = ptr; // other_pointer points to the same thing as ptr 
    *other_ptr = 3;   // manipulate the thing they both point to 
} 

使用功能:

int main() { 
    int x = 2; 
    printf("%d\n", x); 
    Fun(&x); 
    printf("%d\n", x); 
} 

作爲一般規則注意,名爲PtrPointer的變量不應該有int類型,這就是您在代碼中的內容。指針到int的類型爲int *

如果我有一個第二指針(INT * OOF), 然後:

巴= OOF指:巴指向OOF 指針

它的意思是「使杆指向同樣的事情指向「。

欄= * OOF意味着:酒吧指向 值OOF點,但不 的OOF指針本身

這並不意味着什麼,它是無效的。 bar是一個指針*oof是一個int。你不能把一個分配給另一個。

*巴= * OOF指:改變值欄點向值 OOF指向

是。

&欄= & OOF是指:改變內存 地址欄點是相同 的內存地址OOF點 到

不,那又是無效的。 &bar是指向bar變量的指針,但它是所謂的「右值」或「臨時」,並且它不能分配給它。這就像算術計算的結果。你不能寫x + 1 = 5

它可能會幫助您將指針視爲地址。 bar = oof的意思是「make bar,它是一個地址,等於oof,它也是一個地址」。 bar = &foo的意思是「make bar,它是一個地址,等於foo的地址」。如果bar = *oof表示任何內容,則表示「make bar,這是一個地址,等於*oof,這是一個int」。你不能。

然後,&是地址運算符。它的意思是「操作數的地址」,所以&foo是foo的地址(即指向foo的指針)。 *是解引用操作符。它的意思是「操作數給出的地址處的東西」。所以完成bar = &foo,*barfoo

1
void Fun(int* Pointer) -- would be called as Fun(&somevariable) 

將允許您通過取消引用它的樂趣功能,即

*Pointer = 1; 

宣佈它裏面操縱什麼「指針」指向的內容,上面還允許您還能控制超出了數據它指向:

int foo[10] = {0}; 
Fun(foo); 

在函數中你可以這樣做*(Pointer + 1)= 12;設置數組的第二個值。

void Fun(int& Pointer) -- would be called Fun(somevariable) 

您可以修改指針引用的內容,但在這種情況下,您無法訪問指針之外的任何內容。

12

要聲明一個函數,指針爲int:

void Foo(int *x);

要使用此功能:如果你想爲另一種類型的對象的指針


int x = 4; 
int *x_ptr = &x; 
Foo(x_ptr); 
Foo(&x); 

,它更相同:

void Foo(Object *o);

但是,您可能更喜歡使用參考。他們少了幾分撲朔迷離比指針:


// pass a reference 
void Foo(int &x) 
{ 
    x = 2; 
} 

//pass a pointer 
void Foo_p(int *p) 
{ 
    *x = 9; 
} 

// pass by value 
void Bar(int x) 
{ 
    x = 7; 
} 
int x = 4; 
Foo(x); // x now equals 2. 
Foo_p(&x); // x now equals 9. 
Bar(x); // x still equals 9. 

有了引用,你仍然可以更改傳遞給函數在x(就像使用指針),但你不必擔心提領或操作地址。

按照其他人的建議,請查看C++FAQLite。這是一個很好的資源。

編輯3響應:

巴= & FOO意味着:使杆在點存儲器到foo

是。

*巴= foo的方式改變的值欄點等於任何富等於

是。

如果我有一個第二指針(INT * OOF),則:

巴= OOF指:巴指向OOF指針

欄將指向任何OOF點。他們都指向同樣的事情。

欄= * OOF指:巴指向值OOF點,但不與OOF指針本身

號不能做到這一點(假定條的類型是int *的)你可以製作指針指針。 (int **),但是讓我們不要進入那個......你不能指定一個指向int的指針(你可以,但是這是一個與討論不符的細節)。

*巴= * OOF指:改變值欄點向值OOF指向

是。

&欄= & OOF是指:改變內存地址欄點是相同的內存地址OOF點

號你不能這樣做,因爲運營商收益的地址一個右值。基本上,這意味着你不能指定一些東西。