Under most circumstances, an expression that has type "N-element array of T
" will be converted to an expression of type "pointer to T
", and its value will be the address of the first element in the array. This is what happens in the first printf
call; the expression packet.data
, which has type char [500]
, is replaced with an expression of type char *
, and its value is the address of the first element, so you're effectively printing &packet.data[0]
.
One exception to this rule occurs when the array expression is an operand of the unary &
operator; the type of the expression &packet.data
is char (*)[500]
(pointer to 500-element array of char
).
The address of an array is the same as the address of the first element, so both calls to printf
display the same value; it's just that the types of the expressions are different. To be pedantic, both expressions should be cast to void *
in the printf
calls (the %p
conversion specifier expects a void *
argument):
printf("%p
", (void *) packet.data);
printf("%p
", (void *) &packet.data);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…