【问题标题】:C++ pointers - conflict declaration and pointer-to-pointerC++ 指针 - 冲突声明和指针指向
【发布时间】:2011-01-27 16:09:59
【问题描述】:

当我做出以下声明时:

int b;
int c;
int *b;
int *c;

编译后得到如下输出:

注意:我使用的是 Cygwin 控制台,这就是我无法复制粘贴输出的原因

那么,我们是否在这里得出结论,当我们声明一个pointer 变量时,它同时是一个可以自己保存数据的普通变量?换句话说,一个有地址和值的内存位置?

我问这个是因为我想试试pointer-to-pointer

例如,如果我有 `int **c',我怎样才能让它拥有以下内容:

(b) 的值/(b) 的地址/(a) 的值/(a) 的地址

还有,有int ***c吗?

非常感谢。

【问题讨论】:

  • 您可以从 Windows 控制台复制。

标签: c++ pointers declaration conflict


【解决方案1】:

您在同一范围内声明了两个具有相同名称的变量。这是不允许的。

【讨论】:

    【解决方案2】:
    int b;
    int *b; 
    

    显然,这解释了您看到的错误。

    如何声明两个具有相同名称的变量?两个同名变量导致冲突!

    同样的解释:

    int c;
    int *c;
    

    两个同名变量,因此冲突!

    【讨论】:

      【解决方案3】:

      指针是存储内存地址的变量。所以,是的,它有一个值和一个内存地址。

      int *p = 0; int **pp = &p。这是有效的,p 是一个指针,存储在堆栈中,值为 0 和一些内存地址; pp也是在栈上分配的,还有另外一个内存地址,保存着p的内存地址。

      内存地址必须存储在某个地方并占用固定数量的存储空间。例如,根据您的实现,内存地址可以存储在四个字节上。在这种情况下,您有

      • sizeof(char) = 1
      • sizeof(char *) = 4
      • sizeof(任何其他指针类型,包括指向指针的指针) = 4。

      因此,通过执行reinterpret_casts,您的指针可以存储最多占用四个字节的任何类型。但是你为什么要这样做呢?

      【讨论】:

        【解决方案4】:

        是的,指针是一个有值并占用一些内存的常规变量。但是,您收到错误的原因与此无关,这仅仅是因为您尝试使用相同的名称声明两个不同的事物。

        当然,您可以拥有指向指针的指针,甚至指向指向指针的指针,甚至更多级别的这种精神错乱。唯一的问题是如何使用它们。我可以想象指针的很多用途。对于更多级别,我只能想象一种“数组数组”的使用方式,但它仍然是一些东西。

        但是你不应该做的是将错误类型的值存储在变量中。如果您有一个指向指针的指针,则应该在其中存储某个指针(类型正确)的地址,仅此而已,例如:

        int a;
        int *b = &a;
        int **c = &b;
        

        在此示例中,将 a 的值存储在 c 中是绝对错误的,尽管在 int 和指针具有相同大小的平台上是可能的。但这就像将文本字符串存储在一个 - 绝对没有意义和危险。

        【讨论】:

          【解决方案5】:

          让我们教你一些基础知识。

          int b;
          

          b是一个int类型的变量,它保存一个整数值,比如3、-28、49382

          int *b;
          

          b 是一个 int* 类型的变量,它包含一个指针。它可以为 NULL 或指向包含 int 的变量。因为它不是 const int* ,所以您可以对其进行写入和读取。只要它们没有 const(或 volatile)限定符,您就可以移动它以指向不同的 int 变量。您还可以使用指针指向一些动态分配的内存或此类数组的开头(例如int *b = new int;int *b = new int[N])或静态数组中的某个位置。

          所以 b 要么是整数变量,要么是指针变量。不能两者兼有。

          要回答您的最后一点,是的,您可以拥有指向指针的指针,并且深度没有限制,尽管拥有int *******p 显然会变得不可读

          【讨论】:

          • 所以如果我有一个int* 类型的变量,这是否意味着该变量将持有的值是memory address?在这种情况下,int** 类型的变量将持有什么?谢谢
          • 也是内存地址。在那个地址,你可以找到一个指针(即另一个内存地址),然后它指向一个整数。
          【解决方案6】:

          那么,我们是否在这里得出结论,当我们声明一个指针变量时,它同时是一个可以自己保存数据的普通变量?换句话说,一个有地址和值的内存位置?

          是的,这完全正确。指针是一个保存地址的变量。在您的代码中,您已经声明了两个具有相同名称的变量(在同一个命名空间中)。那是不允许的。

          【讨论】: