C++指针问题

3

我仍在使用C++进行工作,但是在我的书中遇到了这个问题,我不明白它的用途:

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

我的问题是第一个间接运算符的意义是什么?
(MyClass *[<- this one] FunctionTwo(MyClass *testClass))?

我尝试在CodeBlocks中创建类似的函数,使用或不使用第一个*,但是我没有看到任何运行方式或输出方面的区别:

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

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

我在我的书中找不到任何关于这个的解释。

谢谢,

Karl

5个回答

10

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

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

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

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++了,语法可能有点不对。


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,y指向存储整数123的x。
x->y->z[123](这不是代码,而是一个文本图表)。
如果我们想要,可以使y指向另一个整数或NULL,以使它不指向任何内容。如果我们想要,可以使z指向另一个指向整数的指针或NULL,以使它不指向任何内容。
那么为什么我们需要指向其他内容的指针呢?以下是一个例子:假设您有一个简单的游戏引擎,并且您想在游戏中存储玩家列表。也许在游戏的某个时刻,通过对该玩家调用kill函数,该玩家可能会死亡:
void kill(Player* p);

我们想要传递指向玩家的指针,因为我们想要杀死原始玩家。如果我们做了这样的事情:
void kill(Player p);

我们不会杀死原始玩家,而是他的一个复制品。这对原始玩家没有任何影响。
指针可以被赋予/初始化为NULL值(即NULL或0),这意味着指针将不指向任何东西(或者如果它之前指向某个东西,则停止指向该东西)。
稍后您将学习引用,它们类似于指针,只是指针可以在其生命周期内更改其指向。引用不能,并避免了明确取消引用指针以访问所指对象(它指向什么)的需要。
注意:我有点绕过了您最初的问题,但是您提供的示例代码没有固有的有意义的行为。在不先了解指针的一般情况下尝试理解该示例,我认为这是逆向工作,并且您最好先学习这个一般理论。

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;
}

那看起来更熟悉了吗?

1

当你定义:

int *testFunc(int *in)

你正在定义一个函数,该函数返回一个指向 int 变量的指针。
int testFuncTwo(int *in)

只返回一个int变量。

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


1
如果有像int * Function()这样的东西,它将返回一个整数指针。MyClass *仅意味着该函数将返回一个指向MyClass类型对象的指针。在c++中,用户定义的对象被视为first-class-objects,因此一旦你创建了自己的对象,它们就可以像标准类型一样作为参数传递、从子程序返回或分配到变量中。
在你发布的代码块中,控制台输出没有任何区别,因为你更改的是函数返回的类型(未使用),函数的内容是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接