2012-07-17 147 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]);