2011-10-07 105 views
2
#include<iostream> 

using namespace std; 

void passPointer(int *pointer) 
{ 
    cout << *pointer; 
} 

int main() 
{ 
    int *iNum = new int(25); 

    passPointer(iNum); 

    return 0; 
} 

有人能向我解释为什么当我在主要使用passPointer()功能,它必须是passPointer(iNum)但不passPointer(*iNum)?是否因为我使用*在参数中取消引用了它?请尽可能详细地解释,因为我有点困惑。C++函数指针作为PARAM

谢谢你们。

回答

2

我非常同情这类问题,因为这是我在学习C++时遇到的唯一困难之一。

的基本问题是,在C++的语法中,*&字符用于具有相似但略有不同的含义许多不同的事情。

就你而言,你正考虑在四个不同的地方使用*

首先:int *iNum = new int(25);*正在申报中。这意味着这是一个类型注释,说iNum是一个指针。

第二位:passPointer(*iNum);*坐在表达。这意味着它是解引用运算符,意思是:“得到iNum指向的值”。在这种情况下,iNum指向的值是int。正如您稍后将看到的,passPointer被声明为采用类型为pointer to int的参数,因此您无法将简单的int作为参数传递给passPointer。你应该只是通过iNum(因为iNum指向int的指针)。

第三位:void passPointer(int *pointer)*再次坐在声明中。这意味着它具有与第一个地方相同的含义 - 它说pointer是一个指针(到int)。

第四位:cout << *pointer;*再次坐在表达。这意味着,与第二种情况一样,它是指“取消pointer并获得值pointer正在存储的地址”。

0

是因为我在参数中取消引用它,如果我使用*

是的。 iNum已键入指针int*iNum具有类型int。如果你有一个功能需要int,那么你可以通过它*iNum

0

passPointer()函数采用一个指针到INT。 iNum已经是一个指向int的指针,所以你只需按原样传递它即可。没有必要去尊重它。

1

这创建名称iNum的变量,并键入int *

int *iNum = new int(25); 

此接受int *类型的参数:

void passPointer(int *pointer) 

这通过名称iNum的参数和类型int *

passPointer(iNum); 

不需要考虑指针,这些都是数据类型。只有在你进行指针算术和引用时,才会考虑指针。 )

int****仅仅是一个类型。

3

这是因为您声明passPointer采取了 类型的参数int*iNum的类型为int*,所以可以直接传递给 passPointer*iNum的类型为int,并且没有隐含的 将int转换为int*,因此您无法将其传递给passPointer。更一般地说,在C++中(以及几乎所有其他类型的语言,例如 ),每个表达式和每个变量都有一个类型。 表达式的类型用操作数的类型表示:如果一元*的操作数的 类型为T*(且类型必须是 指针),则结果的类型为T。要调用函数 ,您必须提供正确数量的参数和正确的类型。