【问题标题】: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。 *iNum 有 int 类型,并且没有隐式
int 到 int* 的转换,所以你不能将它传递给 passPointer。
更一般地说,在 C++ 中(以及几乎所有其他类型的语言
好吧),每个表达式和每个变量都有一个类型。一个类型
表达式以其操作数的类型表示:如果
一元 * 的操作数的类型是 T*(并且类型必须是
指针),则结果的类型为T。并调用一个函数,
您必须提供正确数量的参数和正确的类型。
【解决方案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 存储地址的值”。
【解决方案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 的指针,所以你只需按原样传递它。没有必要尊重它。