char list[] = "World";
char *ptr = list + 2;
char **p = &ptr;
问题:为什么&ptr
类型为char**
?我了解p
指向数组的指针,但不是ptr
和char*
的地址?
我看过Is an array name a pointer?,在这种情况下,数组是否可能被视为指针?
答案 0 :(得分:4)
数组是否也被视为指针?
不,指针和数组是不同的类型。引起混淆的部分原因是,在许多情况下,指针可以衰减到数组,而在函数中,类似数组的参数被调整到指针。
为什么& ptr类型为char **?
因为ptr
的类型为char*
。将address-of运算符应用于类型的对象会为您提供指向该类型的指针。
我知道p指向一个指向数组的指针
不,它指向一个指向数组元素的指针。
指向数组的指针完全是另一种类型。例如,这里指向数组的实际指针指向数组:
int a[8];
int (*arr)[8] = &a;
答案 1 :(得分:2)
你必须逐步遵循事情才能轻松理解这一点。
char* ptr
是pointer to char
,因为它指向char
。
<小时/>
p
指向什么?
指向char*
。因此,它是pointer to a pointer to a char
。 p
的类型为char**
。
答案 2 :(得分:1)
&ptr
仅为char **
因为ptr
是char*
。 list
不是指针,它是一个数组。但是ptr
被声明为char *
,所以它是一个指针。
ptr
从指针list + 2
初始化。表达式list + 2
使用运算符+
,它在其操作数上执行数组到指针的转换(如果适用)。因此,在评估list + 2
时,使用数组到指针转换从char
创建指向list
的临时指针。然后通过将2
添加到第一个临时指针来创建另一个临时指针,然后使用第二个临时指针初始化ptr
。
答案 3 :(得分:1)
在大多数情况下,数组的名称“衰减”为指向其第一个元素的指针。
在这种情况下,数组由2个字节组成。其名称list
是指向char *
的{{1}}。
因此,W
指向list + 2
。该指针也存储在r
,ptr
中。
char *
是指向char的指针。因此,char *
是指向char的指针,这正是char **
的内容。
答案 4 :(得分:1)
数组不是指针。这是一个数组。但是,数组可以decay
指向某些上下文中的指针,其中最值得注意的是将数组传递给函数。
答案 5 :(得分:0)
指针也是数组的第一个元素,因此数组的第一个元素的地址和数组的指针是相同的