当我做出以下声明时:
int b;
int c;
int *b;
int *c;
编译时我得到了以下输出:
注意:我正在使用Cygwin控制台,这就是为什么我无法复制粘贴输出
那么,我们在这里得出的结论是,当我们声明一个pointer
变量时,同时是一个可以自己保存数据的普通变量吗?换句话说,一个具有地址和值的存储位置?
我问这个,因为我想尝试pointer-to-pointer
?
例如,如果我有“int ** c”,我怎样才能保持以下内容:
(b)的价值/(b)的地址/(a)的价值/(a)的地址
而且,有int ***c
吗?
非常感谢。
答案 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)
那么,我们在这里得出的结论是,当我们声明一个指针变量时,它同时是一个可以自己保存数据的普通变量吗?换句话说,一个具有地址和值的存储位置?
是的,这是完全正确的。指针是保存地址的变量。在您的代码中,您已声明了两个具有相同名称的变量(在同一名称空间中)。这是不允许的。