Bio*_*i3c 25 c++ pointers arguments function
关于传递指针的工作原理,我有点困惑.
假设我有以下函数和指针,并且......
编辑:
...我想在函数中使用指向某个对象的指针作为参数.
即:
void Fun(int Pointer){
int Fun_Ptr = ---Passed Pointer---;
//So that Fun_Ptr points to whatever ---Passed Pointer points to
Run Code Online (Sandbox Code Playgroud)
在*Pointer和&Pointer符号之间,我很困惑.我知道*指针意味着给它指出的任何东西.
我是否在声明中放入了void(int*pointer).我什么时候使用这个功能?
非常感谢您的协助.
编辑2:
好的,我现在明白在声明中使用*变量意味着将传递指针.但是,当我使用该功能时呢?
即
int main(){
int foo;
int *bar;
bar = foo;
Fun(bar);
}
Run Code Online (Sandbox Code Playgroud)
编辑3: 好的,如果我错了,请纠正我:
根据上述代码的惯例:
bar =&foo表示:使条形指向内存中的foo
*bar = foo表示将条指向的值更改为等于foo等于的值
如果我有第二个指针(int*oof),那么:
bar = oof表示:bar指向oof指针
bar =*oof表示:bar指向oof指向的值,但不指向oof指针本身
*bar =*oof表示:将条指向的值更改为oof指向的值
&bar =&oof表示:更改条指向的内存地址与oof指向的内存地址相同
我有这个权利吗?
编辑4:非常感谢你的帮助(我希望我能接受超过1个答案,但我必须选择第一个答案.我不确定社区维基是如何工作的,但我会这样离开编辑(如果您愿意,可随意将其转换为参考指南).
Tom*_*mas 46
在定义变量和使用变量时,*用法有所不同.
在声明中,
int *myVariable;
Run Code Online (Sandbox Code Playgroud)
表示指向整数数据类型的指针.但在使用中,
*myVariable = 3;
Run Code Online (Sandbox Code Playgroud)
意味着取消引用指针并使其指向的结构等于3,而不是使指针等于内存地址0x 0003.
所以在你的函数中,你想要这样做:
void makePointerEqualSomething(int* pInteger)
{
*pInteger = 7;
}
Run Code Online (Sandbox Code Playgroud)
在函数声明中,*表示您正在传递指针,但在其实际代码体*中表示您正在访问指针指向的内容.
为了摆脱你的任何困惑,我将简要地进入&符号(&)
&表示获取某些东西的地址,它在计算机内存中的确切位置,所以
int & myVariable;
Run Code Online (Sandbox Code Playgroud)
在声明中表示整数或指针的地址!
然而这
int someData;
pInteger = &someData;
Run Code Online (Sandbox Code Playgroud)
意味着使pInteger指针本身(记住,指针只是它们所指向的内存地址)等于'someData'的地址 - 所以现在pInteger将指向某些数据,并且可以在你推荐时使用它来访问它:
*pInteger += 9000;
Run Code Online (Sandbox Code Playgroud)
你能理解这个吗?还有其他什么让你感到困惑吗?
@ EDIT3:
几乎正确,除了三个陈述
bar = *oof;
Run Code Online (Sandbox Code Playgroud)
表示条形指针等于整数,而不是指向的条形,这是无效的.
&bar = &oof;
&符就像一个函数,一旦它返回一个内存地址,你就无法修改它的来源.就像这段代码一样:
returnThisInt("72") = 86;
Run Code Online (Sandbox Code Playgroud)
是无效的,你的也是.
最后,
bar = oof
Run Code Online (Sandbox Code Playgroud)
并不意味着"bar指向oof指针".相反,这意味着bar指向oof指向的地址,因此bar指向foo指向的任何内容 - 而不是指向指向oof的foo的指向.
Jos*_*shD 15
声明一个带有指向int的指针的函数:
void Foo(int *x);
要使用此功能:
int x = 4;
int *x_ptr = &x;
Foo(x_ptr);
Foo(&x);
Run Code Online (Sandbox Code Playgroud)
如果你想要一个指针用于另一种类型的对象,它就是一样的:
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.
Run Code Online (Sandbox Code Playgroud)
使用引用,您仍然可以更改传递给函数的x(就像使用指针一样),但您不必担心取消引用或操作地址.
根据其他人的建议,请查看C++ FAQLite.这是一个很好的资源.
编辑3回复:
bar =&foo表示:使条形指向内存中的foo
是.
*bar = foo表示将条指向的值更改为等于foo等于的值
是.
如果我有第二个指针(int*oof),那么:
bar = oof表示:bar指向oof指针
酒吧将指向任何oof点.他们都会指出同样的事情.
bar =*oof表示:bar指向oof指向的值,但不指向oof指针本身
不能.你不能这样做(假设bar是int*类型)你可以做指针指针.(int**),但是我们没有进入...你不能指定一个int的指针(嗯,你可以,但这是一个与讨论不一致的细节).
*bar =*oof表示:将条指向的值更改为oof指向的值
是.
&bar =&oof表示:更改条指向的内存地址与oof指向的内存地址相同
不能.您不能这样做,因为运营商的地址返回一个右值.基本上,这意味着您无法为其分配内容.