<代码>zippo不是点。 它包含一系列的数值:zippo
和zippo[i]
,0..4 可在某些情况下(特别是在价值方面)向点人“衰败”。 缩略语 在这种情况下,sizeof
将报告阵列的规模,而不是点名大小。
阵列的名称,in Value context, decays to a pointer to its first content. 因此,在价值方面,zippo
与&zippo[0]
,从而具有“在>的阵列上点”;*zippo
,在价值方面与&zippo[0][0]
相同,即“点到int
。 它们的价值相同,但不同类型。
我建议阅读,回答你的第二个问题。 点数与“价值”相同,但指出的空间数量不同。 印刷<代码>zippo+1和*zippo+1
,以便更清楚地看到:
#include <stdio.h>
int main(void)
{
int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5,7} };
printf("%lu
", (unsigned long) (sizeof zippo));
printf("%p
", (void *)(zippo+1));
printf("%p
", (void *)(*zippo+1));
return 0;
}
我的行文是:
32
0xbffede7c
0xbffede78
电话:sizeof(int)
on my organ is 4, and that the second and the third pointers are not equal in Value (as expected).
此外,%p>
specifier needs ave *
in *printf() function,因此,您应将点人排到voidf(printf(>>
>>)
,成为单体功能,因此汇编者可以在此自动转换。
。 当我向点人说一阵“dec”时,我指的是,在价值方面阵列的名称相当于点子。 因此,如果我有<代码>T pt[100]; for some category T
,则名称pt为。 T*
in Value context. <sizeof
and unary &
mente, the name pt
确实如此。 但你可以做<代码>。 T *p = pt;
——这一条完全有效,因为在这方面,<代码>pt<>code>为。 T *
。
请注意,这种“衰败”只发生一次。 因此,我要说:
int zippo[4][2] = { {2,4}, {6,8}, {1,3}, {5,7} };
然后,zippo
, in Value context decays to a pointer of category: pointer to range /code>int。 法典:
int (*p1)[2] = zippo;
有效,
int **p2 = zippo;
将引发“不相容的点派”警告。
以上定义的“编码”
int (*p0)[4][2] = &zippo;
int (*p1)[2] = zippo;
int *p2 = zippo[0];
are all valid. They should print the same value when printed using printf("%p
", (void *)name);
, but the pointers are different in that they point to the whole matrix, a row, and a single integer respectively.