#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)
?是因为如果我使用*
,我会在参数中取消引用它吗?请尽可能详细解释,因为我有点困惑。
谢谢你们。
答案 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的指针,所以你只需按原样传递它。没有必要尊重它。