2010-09-26 213 views
20

我对传递指针的工作原理有些困惑。C++将指针传递给函数(Howto)+ C++指针操作

比方说,我有以下功能和指针,...

编辑

...我想用一个指向某个对象作为函数的参数。

即:

void Fun(int Pointer){ 
    int Fun_Ptr = ---Passed Pointer---; 
    //So that Fun_Ptr points to whatever ---Passed Pointer points to 

的*指针和&指针符号之间,我很迷茫。我知道*指针指的是指向它的任何东西。

我是否在声明中使用了void(int *指针)。当我使用该功能时呢?

您的帮助表示赞赏。

编辑2:

好的,我现在明白,使用在*声明变量意味着一个指针将被传递。但是,当我使用该功能呢?

int main(){ 
    int foo; 
    int *bar; 
    bar = foo; 
    Fun(bar); 
} 

编辑3: 好了,纠正我,如果我错了:

根据上面的代码中的约定:

栏= & FOO手段:使条指向内存中的foo

* bar = foo表示更改t他珍视杆指向等于任何FOO等于

如果我有一个第二指针(INT * OOF),则:

巴= OOF指:巴指向OOF指针

巴= * OOF指:巴指向值OOF点,但不与OOF指针本身

*巴= * OOF是指:该棒积分值更改为到值OOF指向

& bar = & oof表示:将条指向的内存地址改为与指向的内存地址相同

我有这个权限吗?

编辑4:非常感谢所有的帮助(我希望我可以接受1个以上的答案,但我必须要接受第一个答案,我不确定社区wiki是如何工作的,但我会离开用这种方式进行编辑(如果你愿意,可以随意将它变成一个参考指南)。

+0

您的第二次编辑几乎是正确的,但是 – Tomas 2010-09-26 01:13:46

+0

“这是否正确?”。不,你不希望'bar'等于*到'foo',你希望它指向*'foo'。这是通过操作员的地址完成的。 'bar = &foo;'。 – 2010-09-26 01:14:38

+0

bar = foo,是无效的,因为foo是一个int和bar指针。正确的代码是“bar =&foo”,因为作为指针,bar只能存储内存地址而不是int。对评论的答案抱歉。 – Tomas 2010-09-26 01:14:49

回答

39

有一个在*用途的差异,当你要定义一个变量,当你使用它。

在声明,

int *myVariable; 

指指针的整数数据类型。然而,在使用,

*myVariable = 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 

不是说“棒指向OOF指针”这意味着,酒吧指向地址OOF点,所以酒吧点到任何FOO所指向 - 不会吧指向指向oof的foo。

+0

好吧,这是否意味着pInteger指针指向someData指针? – Biosci3c 2010-09-26 01:14:28

+1

我应该澄清,someData不是一个指针,它是一个原始的int。我已经适当地编辑了我的答案。 &符号现在对你有意义吗? – Tomas 2010-09-26 01:15:58

+0

好吧,我想我有点失望了(指针总是让我困惑,我真的很难理解它们)。我想我现在对它有相当好的把握。 – Biosci3c 2010-09-26 01:17:32

-1

你可能会更容易理解使用Functionoids,它们的表现更整洁,功能更强大,请参阅此优秀且强烈推荐的C++ FAQ lite,特别是请参阅第33.12节,但从最初开始阅读那部分要获得它的把握和理解。

要回答你的问题:

typedef void (*foobar)() fubarfn; 

void Fun(fubarfn& baz){ 
    fubarfn = baz; 
    baz(); 
} 

编辑:

  • &指参考地址
  • *意味着什么包含在参考地址的值,称为去参考

因此,使用下面的示例中的引用,表明我们正在传入一个参数,并直接对其进行修改。

void FunByRef(int& iPtr){ 
    iPtr = 2; 
} 

int main(void){ 
    // ... 
    int n; 
    FunByRef(n); 
    cout << n << endl; // n will have value of 2 
} 
+0

也许我应该澄清。我不是试图使用指向函数的指针,而是将一个指针传递给函数的某个对象(比如说一个int),以便函数可以对它执行操作。我会修改我的问题来澄清这一点。 – Biosci3c 2010-09-26 01:06:59

1
void Fun(int *Pointer) 
{ 
    //if you want to manipulate the content of the pointer: 
    *Pointer=10; 
    //Here we are changing the contents of Pointer to 10 
} 

*之前的指针装置的指针的指针(或任何变量)前的内容(除了在声明!)

&意味着该地址

编辑:

int someint=15; 
//to call the function 
Fun(&someint); 
//or we can also do 
int *ptr; 
ptr=&someint; 
Fun(ptr); 
+0

这是C语法,当OP明确指定C++ .... – t0mm13b 2010-09-26 01:16:38

+0

@ tommieb75:它为什么有效C?它也是C++语法,提问者没有指定“C++,C被删除”。无论如何。 – 2010-09-26 01:43:15

3

要传递一个int指针,它应该是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; 
} 
3

如果你想一个指针到INT传递到你的函数,

宣言的功能(如果需要的话):

void Fun(int *ptr); 

的功能定义:

void Fun(int *ptr) { 
    int *other_pointer = ptr; // other_pointer points to the same thing as ptr 
    *other_ptr = 3;   // manipulate the thing they both point to 
} 

使用功能:

int main() { 
    int x = 2; 
    printf("%d\n", x); 
    Fun(&x); 
    printf("%d\n", x); 
} 

作为一般规则注意,名为PtrPointer的变量不应该有int类型,这就是您在代码中的内容。指针到int的类型为int *

如果我有一个第二指针(INT * OOF), 然后:

巴= OOF指:巴指向OOF 指针

它的意思是“使杆指向同样的事情指向“。

栏= * OOF意味着:酒吧指向 值OOF点,但不 的OOF指针本身

这并不意味着什么,它是无效的。 bar是一个指针*oof是一个int。你不能把一个分配给另一个。

*巴= * OOF指:改变值栏点向值 OOF指向

是。

&栏= & OOF是指:改变内存 地址栏点是相同 的内存地址OOF点 到

不,那又是无效的。 &bar是指向bar变量的指针,但它是所谓的“右值”或“临时”,并且它不能分配给它。这就像算术计算的结果。你不能写x + 1 = 5

它可能会帮助您将指针视为地址。 bar = oof的意思是“make bar,它是一个地址,等于oof,它也是一个地址”。 bar = &foo的意思是“make bar,它是一个地址,等于foo的地址”。如果bar = *oof表示任何内容,则表示“make bar,这是一个地址,等于*oof,这是一个int”。你不能。

然后,&是地址运算符。它的意思是“操作数的地址”,所以&foo是foo的地址(即指向foo的指针)。 *是解引用操作符。它的意思是“操作数给出的地址处的东西”。所以完成bar = &foo,*barfoo

1
void Fun(int* Pointer) -- would be called as Fun(&somevariable) 

将允许您通过取消引用它的乐趣功能,即

*Pointer = 1; 

宣布它里面操纵什么“指针”指向的内容,上面还允许您还能控制超出了数据它指向:

int foo[10] = {0}; 
Fun(foo); 

在函数中你可以这样做*(Pointer + 1)= 12;设置数组的第二个值。

void Fun(int& Pointer) -- would be called Fun(somevariable) 

您可以修改指针引用的内容,但在这种情况下,您无法访问指针之外的任何内容。

12

要声明一个函数,指针为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响应:

巴= & FOO意味着:使杆在点存储器到foo

是。

*巴= foo的方式改变的值栏点等于任何富等于

是。

如果我有一个第二指针(INT * OOF),则:

巴= OOF指:巴指向OOF指针

栏将指向任何OOF点。他们都指向同样的事情。

栏= * OOF指:巴指向值OOF点,但不与OOF指针本身

号不能做到这一点(假定条的类型是int *的)你可以制作指针指针。 (int **),但是让我们不要进入那个......你不能指定一个指向int的指针(你可以,但是这是一个与讨论不符的细节)。

*巴= * OOF指:改变值栏点向值OOF指向

是。

&栏= & OOF是指:改变内存地址栏点是相同的内存地址OOF点

号你不能这样做,因为运营商收益的地址一个右值。基本上,这意味着你不能指定一些东西。