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

时间:2015-12-08 15:27:19

标签: c++ c arrays pointers

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

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

我看过Is an array name a pointer?,在这种情况下,数组是否可能被视为指针?

6 个答案:

答案 0 :(得分:4)

  

数组是否也被视为指针?

不,指针和数组是不同的类型。引起混淆的部分原因是,在许多情况下,指针可以衰减到数组,而在函数中,类似数组的参数被调整到指针。

  

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

因为ptr的类型为char*。将address-of运算符应用于类型的对象会为您提供指向该类型的指针。

  

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

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

指向数组的指针完全是另一种类型。例如,这里指向数组的实际指针指向数组:

int a[8];
int (*arr)[8] = &a;

答案 1 :(得分:2)

你必须逐步遵循事情才能轻松理解这一点。

char* ptrpointer to char,因为它指向char

<小时/> p指向什么?

指向char*。因此,它是pointer to a pointer to a charp的类型为char**

答案 2 :(得分:1)

&ptr仅为char **因为ptrchar*list不是指针,它是一个数组。但是ptr被声明为char *,所以它是一个指针。

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

答案 3 :(得分:1)

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

在这种情况下,数组由2个字节组成。其名称list是指向char *的{​​{1}}。

因此,W指向list + 2。该指针也存储在rptr中。

char *是指向char的指针。因此,char *是指向char的指针,这正是char **的内容。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

指针也是数组的第一个元素,因此数组的第一个元素的地址和数组的指针是相同的