【问题标题】:C++ pointers to functions as param指向函数的 C++ 指针作为参数
【发布时间】:2011-10-07 10:14:08
【问题描述】:
#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)?如果我使用*,是不是因为我在参数处取消引用它?请尽可能详细地解释,因为我有点困惑。

谢谢各位。

【问题讨论】:

    标签: c++ function pointers


    【解决方案1】:

    这是因为您已声明 passPointer 接受参数 输入int*iNum 的类型为 int*,因此可以直接传递给 passPointer*iNumint 类型,并且没有隐式 intint* 的转换,所以你不能将它传递给 passPointer

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

    【讨论】:

      【解决方案2】:

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

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

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

      首先: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 &lt;&lt; *pointer;* 再次出现在表达式中。这意味着,与第二种情况一样,它是说“取消引用pointer 并获取pointer 存储地址的值”。

      【讨论】:

        【解决方案3】:

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

        int *iNum = new int(25);
        

        这个接受int *类型的参数:

        void passPointer(int *pointer)
        

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

        passPointer(iNum);
        

        不用考虑指针,这些都是数据类型。仅在进行指针算术和引用时才考虑指针,引用。 ;)

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

        【讨论】:

          【解决方案4】:

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

          是的。 iNum 具有指向 int 的类型指针,*iNum 具有类型 int。如果你有一个接受int 的函数,那么你可以将它传递给*iNum

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-07-11
              • 1970-01-01
              • 2011-10-24
              • 2017-11-28
              • 1970-01-01
              • 1970-01-01
              • 2013-03-31
              • 1970-01-01
              相关资源
              最近更新 更多