C ++指针 - 冲突声明和指针指针

时间:2011-01-27 16:10:00

标签: c++ pointers declaration conflict

当我做出以下声明时:

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

编译时我得到了以下输出:

enter image description here

注意:我正在使用Cygwin控制台,这就是为什么我无法复制粘贴输出

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

我问这个,因为我想尝试pointer-to-pointer

例如,如果我有“int ** c”,我怎样才能保持以下内容:

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

而且,有int ***c吗?

非常感谢。

6 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

int b;
int *b; 

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

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

同样的解释:

int c;
int *c;

两个具有相同名称的变量,因此存在冲突!

答案 2 :(得分:1)

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

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

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

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

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

答案 3 :(得分:1)

是的,指针是一个具有值并占用一些内存的常规变量。你得到的错误的原因与此无关,只是因为你试图用相同的名称声明两个不同的东西。

当然,你可以指向指针甚至是指向指针的指针,甚至可以指出这种疯狂的更多层次。唯一的问题是如何使用它们。我可以想象很多用于指针的指针。对于更多级别,我只能想象一种“数组阵列”的用途,但它仍然是一些东西。

但你不应该做的是将错误类型的值存储在变量中。如果你有一个指向指针的指针,你应该在那里存储一些指针(正确类型)的地址,没有别的,例如:

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

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

答案 4 :(得分:1)

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

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

显然会变得不可读

答案 5 :(得分:1)

  

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

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