C++ C++;指针-冲突声明和指向指针的指针

C++ C++;指针-冲突声明和指向指针的指针,c++,pointers,declaration,conflict,C++,Pointers,Declaration,Conflict,当我作出以下声明时: int b; int c; int *b; int *c; 编译时,我得到了以下输出: 注意:我使用的是Cygwin控制台,这就是我无法复制粘贴输出的原因 那么,我们在这里是否得出结论,当我们声明一个指针变量时,它同时是一个普通变量,可以自己保存数据?换句话说,有地址和值的内存位置 我问这个问题是因为我想尝试指针指向指针 例如,如果我有'int**c',如何使其包含以下内容: 价值(b)/地址(b)/价值(a)/地址(a) 还有,有没有int***c 非常感谢 int

当我作出以下声明时:

int b;
int c;
int *b;
int *c;
编译时,我得到了以下输出:

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

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

我问这个问题是因为我想尝试
指针指向指针

例如,如果我有'int**c',如何使其包含以下内容:

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

还有,有没有
int***c

非常感谢

int b;
int *b; 
显然,这解释了您看到的错误

如何声明两个同名变量?两个同名变量导致冲突

对此也有同样的解释:

int c;
int *c;

两个同名变量,因此发生冲突

您正在同一范围内声明两个同名变量。这是不允许的。

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

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

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

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

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

是的,指针是一个有值并占用一些内存的正则变量。但是,出现错误的原因与此无关,只是因为您试图用相同的名称声明两个不同的事物

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

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

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

在本例中,将a的值存储在c中是绝对错误的,尽管在int和指针大小相同的平台上也是可能的。但这就像是把一个文本字符串存储在一个文件中——毫无意义,也很危险。

让我们来教你一些基本知识

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

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

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

为了回答您的最后一点,是的,您可以有指向指针的指针,并且深度没有限制,尽管使用
int*******p

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


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

您可以从Windows控制台复制。因此,如果我有一个
int*
类型的变量,这是否意味着该变量将保存的值是一个
内存地址
?在这种情况下,
int**
类型的变量将保存什么?谢谢一个内存地址。在该地址,您可以找到一个指针(即另一个内存地址),然后指向一个整数。