C ++指针问题

时间:2010-06-29 04:57:18

标签: c++ function pointers

仍然在C ++工作,但是我的书中出现了这一点,我不明白它是什么:

MyClass * FunctionTwo (MyClass *testClass) {
    return 0;
}

我的问题是第一个间接运算符

的重要性是什么
(MyClass *[<- this one] FunctionTwo(MyClass *testClass))?

我尝试在代码块中创建一个类似于它的函数,有和没有第一个*,我没有看到它运行的方式或输出的任何差异:

int *testFunc(int *in) {
    cout << in << endl;
    cout << *in << endl;
    return 0;
}

int testFuncTwo(int *in) {
    cout << in << endl;
    cout << *in << endl;
    return 0;
}

我在书中找不到任何有关它的解释。

谢谢,

卡尔

5 个答案:

答案 0 :(得分:10)

MyClass *表示此函数返回指向MyClass实例的指针。

由于代码实际上返回0(或NULL),这意味着此函数的任何调用者都会返回一个指向MyClass对象的NULL指针。

我认为以下是更好的例子:

int *testFunc(int *in) {
    cout << "This is the pointer to in " <<  in << endl;
    cout << "This is the value of in "  << *in << endl;
    return in;
}

int testFuncTwo(int *in) {
    cout << "This is the pointer to in " <<  in << endl;
    cout << "This is the value of in "  << *in << endl;
    return *in;
}


void test() {
  int a = 1;

  cout << "a = " << a;

  int output = *testFunc(&a); // pass in the address of a
  cout << "testFunc(a) returned " << output;

  output = testFuncTwo(&a); // pass in the address of a
  cout << "testFuncTwo(a) returned " << output;

}

道歉,但我多年没有做过C ++,但语法可能有些偏差。

答案 1 :(得分:2)

鉴于问题的性质,我将提供一些粗略的答案。

指针指向某物:

int x = 123; // x is a memory location (lvalue)
int* y = &x; // y points to x
int** z = &y; // z points to y

在上面的代码中,z指向y,它指向存储积分123的x。

  

x-&gt; y-&gt; z [123](这不是代码,它是a   文字图)

我们可以使y指向另一个整数,如果我们想要或NULL使它指向任何东西,我们可以使z指向另一个指向整数的指针,如果我们想要或NULL使它指向任何东西。

那么为什么我们需要指向其他东西的指针呢?这是一个例子:假设你有一个简单的游戏引擎,你想在游戏中存储一个玩家列表。也许在游戏中的某个时刻,玩家可以通过在该玩家上调用杀戮功能而死亡:

void kill(Player* p);

我们希望将指针传递给玩家,因为我们想要杀死原始玩家。如果我们这样做了:

void kill(Player p);

我们不会杀死原来的玩家,而是杀死他的副本。这对原来的玩家没有任何作用。

可以使用NULL值(NULL或0)分配/初始化指针,这意味着指针不会指向任何内容(或者如果之前指向某个内容则停止指向任何内容)。

稍后您将学习与指针类似的引用,除非指针可以更改其生命周期中指向的内容。引用不能,并且不需要显式地取消引用指针来访问指针对象(它指向的是什么)。

注意:我有点绕过你原来的问题,但你提供的示例代码没有固有的有意义的行为。在没有首先理解一般意义上的指针的情况下试图理解这个例子是向后工作恕我直言,你最好先学习这个一般理论。

答案 2 :(得分:2)

采用单个值并在C ++中返回单个值的函数的一般格式为:

return_type function name (    parameter_type parameter_name )

在你的情况下,return_type是MyClass *,意思是“指向MyClass的指针” 此外,在您的情况下,parameter_type也是MyClass *。

换句话说,您的代码可以重写为:

typedef MyClass *PointerToMyClass;
PointerToMyClass FunctionTwo (PointerToMyClass testClass)
{
 return 0;
}

这看起来更熟悉吗?

答案 3 :(得分:1)

定义时:

int *testFunc(int *in)

您正在定义一个函数,它将指针返回给int变量。

int testFuncTwo(int *in)

只返回一个int变量。

在这种情况下,零正在进行隐式转换 - 第一个函数返回(int*) 0,第二个函数返回0。如果您将示例函数的原型从返回MyClass*更改为仅返回MyClass - 如果operator int中没有MyClass方法,则可以看到此隐式强制转换操作,你会得到一个很好的错误。

答案 4 :(得分:1)

如果你有类似int * Function()的东西,这将返回一个指向整数的指针。 MyClass *只是意味着该函数将返回一个指向MyClass类型对象的指针。在c ++中,用户定义的对象被视为first-class-objects,因此一旦创建了自己的对象,它们就可以作为参数传递,从子例程返回,或者像标准类型一样分配给变量。

在您发布的代码块中,输出到控制台没有区别,因为您更改的内容是函数返回的类型(未使用),函数的内容相同。