3 回答
TA贡献1869条经验 获得超4个赞
阵列的名称通常计算到所述阵列的所述第一元素的地址,所以array
与&array
具有相同的值(但不同类型的,所以array+1
和&array+1
将不如果数组超过1个元件长是相等的)。
这有两个例外:当数组名称是sizeof
或一元&
(address-of)的操作数时,名称指的是数组对象本身。因此,sizeof array
为您提供整个数组的字节大小,而不是指针的大小。
对于定义为的数组T array[size]
,它将具有类型T *
。当/如果你增加它,你会到达数组中的下一个元素。
&array
求值为相同的地址,但给定相同的定义,它会创建一个类型的指针T(*)[size]
- 即,它是指向数组的指针,而不是指向单个元素的指针。如果递增此指针,它将添加整个数组的大小,而不是单个元素的大小。例如,使用以下代码:
char array[16];printf("%p\t%p", (void*)&array, (void*)(&array+1));
我们可以期望第二个指针比第一个指针大16(因为它是一个16个字符的数组)。由于%p通常以十六进制转换指针,因此它可能类似于:
0x12341000 0x12341010
TA贡献1772条经验 获得超6个赞
在C中,当您在表达式中使用数组的名称(包括将其传递给函数)时,除非它是address-of(&
)运算符或sizeof
运算符的操作数,否则它将衰减为指向其第一个元素的指针。
也就是说,在大多数情况下array
,相当于&array[0]
在这两个类型和值。
在您的示例中,my_array
具有在将其传递给printf时char[100]
衰减到的类型char*
。
&my_array
有类型char (*)[100]
(指向数组100的指针char
)。因为它是操作数&
,所以这是my_array
不会立即衰减到指向其第一个元素的指针的情况之一。
指向数组的指针具有与指向数组第一个元素的指针相同的地址值,因为数组对象只是其元素的连续序列,但指向数组的指针与指向元素的指针的指针具有不同的类型。那个数组。当您对两种类型的指针进行指针运算时,这很重要。
pointer_to_array
具有类型char *
- 初始化为指向数组的第一个元素,因为它是my_array
初始化表达式中的衰减 - 并且&pointer_to_array
具有类型char **
(指向a的指针char
)。
其中:( my_array
在衰减之后char*
),&my_array
并且pointer_to_array
都直接指向数组或数组的第一个元素,因此具有相同的地址值。
- 3 回答
- 0 关注
- 733 浏览
添加回答
举报