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
的内存地址
内存地址必须存储在某个地方,并占用固定的存储空间。例如,根据您的实现,内存地址可以存储在四个字节上。在这种情况下,您必须
=1sizeof(char)
=4sizeof(char*)
任何其他指针类型,包括指向指针的指针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**
类型的变量将保存什么?谢谢一个内存地址。在该地址,您可以找到一个指针(即另一个内存地址),然后指向一个整数。