C ++指向函数的指针作为参数

时间:2011-10-07 10:14:08

标签: c++ function pointers

#include<iostream>

using namespace std;

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

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

    passPointer(iNum);

    return 0;
}

有人可以向我解释为什么当我在main中使用passPointer()函数时,它必须是passPointer(iNum)而不是passPointer(*iNum)?是因为如果我使用*,我会在参数中取消引用它吗?请尽可能详细解释,因为我有点困惑。

谢谢你们。

5 个答案:

答案 0 :(得分:3)

这是因为你已声明passPointer参与其中 输入int*iNum的类型为int*,因此可以直接传递给 passPointer*iNum的类型为int,并且没有隐式 将int转换为int*,因此您无法将其传递给passPointer

更一般地说,在C ++中(以及几乎所有其他类型的语言) ()),每个表达式和每个变量都有一个类型。的类型 表达式以其操作数的类型表示:如果是 一元*的操作数的类型是T*(类型必须是a 指针),然后结果的类型是T。并调用一个函数, 您必须使用正确的类型提供正确数量的参数。

答案 1 :(得分:2)

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

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

在您的情况下,您正考虑在四个不同的地方使用*

首先:int *iNum = new int(25);*位于声明中。这意味着is是一个类型注释,表示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存储地址”的值。

答案 2 :(得分:1)

这会创建名称iNum的变量并输入int *

int *iNum = new int(25);

int *类型的接受参数:

void passPointer(int *pointer)

这会传递名称iNum的参数并输入int *

passPointer(iNum);

无需考虑指针,这些都是数据类型。只有当你做指针算术和引用,引用时才能想到指针。 ;)

int****只是一种类型。

答案 3 :(得分:0)

  

是否因为我使用*

在参数中取消引用它

是。 iNum具有指向int的类型指针,*iNum具有类型int。如果您的某个函数需要int,那么您可以将其传递给*iNum

答案 4 :(得分:0)

passPointer()函数接受指向int的指针。 iNum已经是指向int的指针,所以你只需按原样传递它。没有必要尊重它。