对于传递指针是如何工作的,我有点困惑。
假设我有以下函数和指针,并且...
编辑:
...I希望在函数中使用指向某个对象的指针作为参数。
即:
void Fun(int Pointer){
int Fun_Ptr = ---Passed Pointer---;
//So that Fun_Ptr points to whatever ---Passed Pointer points to
在*Pointer和&Pointer符号之间,我很困惑。我知道*Pointer的意思是给它所指向的任何东西。
我是否要在声明中放入void (int *指针)?当我使用这个函数的时候呢?
非常感谢您的帮助。
EDIT 2:
好了,我现在明白了,在声明中使用*变量意味着将传递一个指针。但是,当我使用这个函数的时候呢?
即
int main(){
int foo;
int *bar;
bar = foo;
Fun(bar);
}
EDIT 3:好的,如果我错了,请纠正我:
根据上述代码的约定:
bar = &foo表示:使bar指向内存中的foo
*bar = foo表示将bar指向的值更改为等于foo等于的值
如果我有第二个指针(int *oof),那么:
bar = oof表示: bar指向oof指针
bar = *oof表示: bar指向oof所指向的值,而不是oof指针本身
*bar = *oof表示:将bar指向的值更改为oof指向的值
&bar = &oof表示:将bar指向的内存地址更改为与oof指向的内存地址相同
我说的对吗?
编辑4:非常感谢你的帮助(我希望我能接受不止一个答案,但我不得不接受第一个答案。我不确定一个社区wiki到底是如何工作的,但我会把它留下来进行编辑(如果你喜欢,可以把它变成一个参考指南)。
发布于 2010-09-26 09:07:45
在定义变量和使用变量时,*的用法是不同的。
在声明中,
int *myVariable;
表示指向整型数据类型的指针。然而,在使用中,
*myVariable = 3;
意味着取消对指针的引用,并使其指向的结构等于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
并不意味着"bar指向oof指针“。相反,这意味着bar指向oof指向的地址,所以bar指向foo指向的任何内容-而不是bar指向指向oof的foo。
发布于 2010-09-26 09:20:56
要声明一个接受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响应:
bar = &foo表示:使bar指向内存中的foo
是。
*bar = foo表示将bar指向的值更改为等于foo等于的值
是。
如果我有第二个指针(int *oof),那么:
bar = oof表示: bar指向oof指针
bar将指向oof指向的任何内容。它们都会指向同一件事。
bar = *oof表示: bar指向oof所指向的值,而不是oof指针本身
不是的。你不能这样做(假设bar的类型是int *),你可以制作指针指针。(int **),但我们不要深入到这一点...您不能将指针赋给int (好吧,您可以,但这是一个与讨论不符的细节)。
*bar = *oof表示:将bar指向的值更改为oof指向的值
是。
&bar = &oof表示:将bar指向的内存地址更改为与oof指向的内存地址相同
不是的。你不能这样做,因为运算符的地址返回一个右值。基本上,这意味着你不能给它赋值。
发布于 2010-09-26 09:07:39
要将指针传递给整型数,它应该是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;
}
https://stackoverflow.com/questions/3796181
复制相似问题