C++将指针传递给函数(Howto)+ C++指针操作

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指向的内存地址相同

不能.您不能这样做,因为运营商的地址返回一个右值.基本上,这意味着您无法为其分配内容.