C++ 为什么地址被认为是指针?

C++ 为什么地址被认为是指针?,c++,c,arrays,pointers,C++,C,Arrays,Pointers,问题:为什么&ptr的类型是char**?我知道p指向数组的指针,但不是ptrachar*的地址 我已经看过了,在这种情况下,数组是否也被视为指针?您必须循序渐进地理解这一点 char*ptr是指向char的指针,因为它指向的是char p指的是什么 它指向一个字符*。因此,它是指向字符的指针。也就是说,p属于char**类型 数组也被认为是指针吗 不,指针和数组是不同的类型。产生混淆的部分原因是,在许多情况下,指针可能会衰减为数组,而在函数中,类似数组的参数会调整为指针 为什么&ptr的类型

问题:为什么
&ptr
的类型是
char**
?我知道
p
指向数组的指针,但不是
ptr
a
char*
的地址


我已经看过了,在这种情况下,数组是否也被视为指针?

您必须循序渐进地理解这一点

char*ptr
是指向char的
指针,因为它指向的是
char


p
指的是什么

它指向一个
字符*
。因此,它是指向字符的
指针。也就是说,
p
属于
char**
类型

数组也被认为是指针吗

不,指针和数组是不同的类型。产生混淆的部分原因是,在许多情况下,指针可能会衰减为数组,而在函数中,类似数组的参数会调整为指针

为什么&ptr的类型为char**

因为
ptr
属于
char*
类型。将运算符的地址应用于类型的对象会提供指向该类型的指针

我知道p指向一个数组的指针

不,它指向一个指针,该指针指向数组的一个元素

指向数组的指针是完全不同的类型。例如,此处设置一个指向数组的实指针以指向数组:

char list[] = "World";
char *ptr = list + 2;
char **p = &ptr;

&ptr
是一个
char**
仅仅因为
ptr
是一个
char*
<代码>列表
不是指针,而是数组。但是
ptr
被声明为
char*
,所以它是一个指针

ptr
是从指针
list+2
初始化的。表达式
list+2
使用运算符
+
,该运算符对其操作数执行数组到指针的转换(如果适用)。因此,在计算
list+2
时,使用数组到指针的转换从
list
创建指向
char
的临时指针。然后,通过向第一个临时指针添加
2
来创建另一个临时指针,然后使用第二个临时指针初始化
ptr

在大多数情况下,数组的名称“衰减”为指向其第一个元素的指针

在本例中,数组由2个字节组成。它的名称
list
是一个指向
W
char*

因此,
list+2
指向
r
。该指针存储在
ptr
中,也存储在
char*


char*
是指向char的指针。因此,
char**
是指向char的指针,这正是
&ptr
的含义。

数组不是指针。这是一个数组。但是,在某些上下文中,数组可以衰减到指针,其中最值得注意的是将数组传递给函数。

指针也是数组的第一个元素,因此,数组的第一个元素的地址和数组的指针将是相同的。如果
ptr
char*
,那么它的地址是
(char*)*
,即
char**
。不,OP是正确的:
char**p=&ptr
p
初始化为指向数组的指针,而不是指向数组的元素。如果要明确区分“指针”和“数组”,请确定。但在这两种情况下,
p
都不是指向数组元素的指针。这是一个指向元素的指针。@Timpiers我正在画一个明确的区分,这就是全部要点。你的新编辑就是我想在前面展示的内容。:)@哈里斯:谢谢。我把
p
ptr
搞混了。
int a[8];
int (*arr)[8] = &a;