2012-07-17 103 views
1

我最近審查谷歌的C++ materials和整個following code來抓演示指針C++指針 - ressignment在函數調用

void Unknown(int *p, int num); 
void HardToFollow(int *p, int q, int *num); 

void Unknown(int *p, int num) { 
int *q; 

q = # 
*p = *q + 2; 
num = 7; 
} 

void HardToFollow(int *p, int q, int *num) { 
*p = q + *num; 
*num = q; 
num = p; 
p = &q; 
Unknown(num, *p); 
} 

main() { 
int *q; 
int trouble[3]; 

trouble[0] = 1; 
q = &trouble[1]; 
*q = 2; 
trouble[2] = 3; 

HardToFollow(q, trouble[0], &trouble[2]); 
Unknown(&trouble[0], *q); 

cout << *q << " " << trouble[0] << " " << trouble[2]; 
} 

我的問題是:將q指針被分配給原來的麻煩[1]。當發送到HardToFollow時,q指針(現在稱爲p)被更新爲值4,並且麻煩[1]隨後也被更新。緊接着,原來的q指針(再次,在這個函數中被稱爲p)被重定向到指向一個局部變量(p = & q)。儘管如此,在程序結束時,我們原來的q指針又回到了指向麻煩的地步[1]。這怎麼發生的?

+5

你在哪裏看到的東西,改變了'q'指針? 'q'指針不是「在這個函數中被稱爲p」。該函數有一個叫做'p'的指針,它的起始值與'q'指針相同。 – 2012-07-17 08:47:41

+0

請注意,這些不是「C++」,而是舊的純C指針。 – 2012-07-17 08:56:20

+0

@IgorR。雖然C和C++指針大部分以相似的方式起作用,但它們並不是一回事。 C和C++是不同的語言;不要混合它們。 – Alex 2012-07-17 12:55:28

回答

3

你不能簡單的修改main::q六通過值傳遞給HardToFollow函數。因爲你的q通過價值傳遞,因此在HardToFollow中,您可以通過pp修改q指向的內容,但不能修改q指向其他內容。

略微修改的例子應做什麼,你就期待:

void HardToFollow(int*& p, int q, int *num) { 
*p = q + *num; 
*num = q; 
num = p; 
p = &q; 
//Unknown(num, *p); //forget about this for now 
} 
0

因爲在功能未知的不指針•從主要功能
工作的功能只適用於我添加了一些意見,使人們明確的指針名爲NUM

1

的價值:

void HardToFollow(int *p, int q, int *num) { 
    /* this modifies the value pointed to by p */ 
    *p = q + *num; 
    *num = q; 
    num = p; 
    /* this does not modify the original pointer */ 
    p = &q; 
    Unknown(num, *p); 
} 

[...]

/* the memory address q points to is copied to the function scope */ 
    HardToFollow(q, trouble[0], &trouble[2]);