首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将指针传递给函数的C++ (Howto) + C++指针操作

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

Stack Overflow用户
提问于 2010-09-26 08:59:18
回答 7查看 157.3K关注 0票数 28

对于传递指针是如何工作的,我有点困惑。

假设我有以下函数和指针,并且...

编辑

...I希望在函数中使用指向某个对象的指针作为参数。

即:

代码语言:javascript
复制
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:

好了,我现在明白了,在声明中使用*变量意味着将传递一个指针。但是,当我使用这个函数的时候呢?

代码语言:javascript
复制
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到底是如何工作的,但我会把它留下来进行编辑(如果你喜欢,可以把它变成一个参考指南)。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-09-26 09:07:45

在定义变量和使用变量时,*的用法是不同的。

在声明中,

代码语言:javascript
复制
int *myVariable;

表示指向整型数据类型的指针。然而,在使用中,

代码语言:javascript
复制
*myVariable = 3;

意味着取消对指针的引用,并使其指向的结构等于3,而不是使指针等于内存地址0x 0003。

所以在你的函数中,你想这样做:

代码语言:javascript
复制
void makePointerEqualSomething(int* pInteger)
{
    *pInteger = 7;
}

在函数声明中,*表示您正在传递指针,但在其实际代码体中,*表示您正在访问指针所指向的内容。

为了消除您的疑惑,我将简要介绍与号(&)

&表示获取某物的地址,即其在计算机内存中的确切位置,因此

代码语言:javascript
复制
 int & myVariable;

在声明中表示整数或指针的地址!

然而,这是

代码语言:javascript
复制
int someData;    
pInteger = &someData;

意思是让pInteger指针本身(记住,指针只是它们所指向的内存地址)等于'someData‘的地址--所以现在pInteger将指向一些数据,当你引用它时,可以用它来访问它:

代码语言:javascript
复制
*pInteger += 9000;

这对你来说有意义吗?还有什么让你感到困惑的地方吗?

@Edit3:

几乎是正确的,除了三个陈述

代码语言:javascript
复制
bar = *oof;

表示条形指针等于一个整数,而不是条形指向的值,这是无效的。

&bar = &oof;

和号就像一个函数,一旦它返回一个内存地址,你就不能修改它的来源。就像下面的代码一样:

代码语言:javascript
复制
returnThisInt("72") = 86; 

是无效的,你的也是。

最后,

代码语言:javascript
复制
bar = oof

并不意味着"bar指向oof指针“。相反,这意味着bar指向oof指向的地址,所以bar指向foo指向的任何内容-而不是bar指向指向oof的foo。

票数 52
EN

Stack Overflow用户

发布于 2010-09-26 09:20:56

要声明一个接受int指针的函数,请执行以下操作:

void Foo(int *x);

要使用此函数:

代码语言:javascript
复制
int x = 4;
int *x_ptr = &x;
Foo(x_ptr);
Foo(&x);

如果你想要一个指针指向另一种类型的对象,它几乎是一样的:

void Foo(Object *o);

但是,您可能更喜欢使用引用。它们在某种程度上没有指针那么令人困惑:

代码语言:javascript
复制
// 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指向的内存地址相同

不是的。你不能这样做,因为运算符的地址返回一个右值。基本上,这意味着你不能给它赋值。

票数 19
EN

Stack Overflow用户

发布于 2010-09-26 09:07:39

要将指针传递给整型数,它应该是void Fun(int* pointer)

将引用传递给int将如下所示...

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3796181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档