【问题标题】:C++ Questions: pointers/memory addresses and subclassesC++ 问题:指针/内存地址和子类
【发布时间】:2010-01-31 03:36:21
【问题描述】:

为什么我们可以运行这段代码:

int* FunctionB(int x)
{
    int temp =30;

    //more code

    return &temp;
}

在我看来,我并没有按我说的去做。如果我将返回类型声明为指针,为什么可以返回内存地址。指针不是指向内存地址的东西,实际上不是内存地址吗?


class Image : public BMP
{
    public:
    void invertcolors();
    void flipleft();
    void adjustbrightness(int r,int g,int b);

    private:
};

在编译之前的代码时,我得到了这个错误:

image.h:3:错误:“{”标记之前的预期类名

但我认为我使用了正确的语法来声明子类。我写的有问题吗?

【问题讨论】:

  • 您可以将多个问题作为多个问题提出,而不是将它们塞进一个问题中,尤其是当它们不相关时。
  • 另外,去接受一些答案。

标签: c++ memory pointers subclass


【解决方案1】:

就您的第一个问题而言

为什么我们可以运行这段代码:

没有什么可以阻止您返回局部变量的地址,但那是危险的(标记我的话)。事实上返回地址或局部变量的引用会调用 Undefined Behaviour(这意味着任何事情都可能发生)。

也可以看看this.

为什么我声明返回类型是指针,内存地址可以返回?

这意味着你必须学习指针的基础知识。在计算机科学中,pointer 是一种编程语言数据类型,其值直接引用(或“指向”)存储在计算机内存中其他位置的另一个值使用其地址

..但我认为我使用了正确的语法来声明一个子类。我写的有问题吗?

您是否定义了 BMP 或是否包含了包含其定义的标头?

【讨论】:

    【解决方案2】:

    在第一种情况下,指针一个内存地址,它指向一些数据,所以你的语法是正确的。但是,在这种情况下,您返回的是局部变量的地址,因此函数调用结束后它将指向什么是未定义的。

    在第二种情况下,编译器抱怨,因为它不知道BMP 是什么。你可能忘记了#include BMP 类的头文件。

    【讨论】:

    • 我希望它可以确定它指向垃圾,然后可能会注意到问题是它可能看起来代码实际上表现得很好,直到该地址的内容被更改。然后突然事情开始出错了。很好,有一些被称为警告的东西。
    • @daramark,是的,我喜欢用垃圾来表示未定义,但我进行了编辑以澄清一点。
    【解决方案3】:

    在 C 和 C++ 语言中,术语 address 和术语 pointer [几乎] 是精确的同义词。在实际的不太正式的语言中,术语 address 最常用于指代 rvalue 指针值,而术语 pointer 可以看到用于rvaluelvalue 指针值。在您的第一个示例中,您将返回一个右值,因此术语“地址”和“指针”可以互换使用。您将 pointer 返回到 int 对象。您正在返回 int 对象的 地址。两者的意思是一样的。当然,返回本地对象的地址是没有意义的,除非是故意尝试导致未定义的行为。

    至于第二个问题,编译器根本不知道BMP 是什么。你没有声明。此外,必须先定义一个类,然后才能将其用作另一个类声明的基类。

    【讨论】:

      【解决方案4】:

      这样想:

      如果

      char myChar;
      

      声明一个存储字符的变量,

      int* myPtr;
      

      声明一个存储内存地址的变量。

      类似地,如果

      char myCharFunction();
      

      声明一个返回字符的函数,

      int* myPtrFunction();
      

      正在声明一个返回内存地址的函数。

      因此,由于您的函数的签名是int* FunctionB(int x),因此返回内存地址是正确的。

      这里要理解的重要一点是int* 表示“内存地址”。而我们所说的“指针”只不过是一个存储地址的变量。当有人说一个指针“指向一个地址”时,他们的意思是指针持有该地址本身(就像char变量持有一个字符一样)。

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 2020-08-15
        • 1970-01-01
        • 2020-07-03
        • 2013-11-22
        • 1970-01-01
        • 2015-07-09
        • 2020-07-06
        相关资源
        最近更新 更多