我们知道,当我们使用数组时,它保存第一个元素的地址,而&array是存储整个数组地址,当我在printf中使用它时为true,但在sizeof运算符中,这是相反的行为,为什么
我在Windows 7上使用带有GCC的代码块
int main(void) { int c[5]; printf(" %d %d %d %d\n",c,c+1,&c,&c+1);\\when we add 1 in "c" it add more 4 bytes and when "&c+1" it add 20 byte witch is true printf(" %u %u ",sizeof(c),sizeof(&c));\\But when we print first element size (with "c") it give 20 byte and when print (With "&c") whole arry size it give 4 byte return 0; }
\我不明白为什么请解释
我认为您在这里需要知道的&array
仍然是一个指针,只是类型有所不同。
对于像这样的数组 int arr[]={4,3,2,1,0}
在大多数情况下,arr
与相同&arr[0]
,即,int *
但对于sizeof
算子,其行为有所不同(请参见下面的注释)。当传递给sizeof
运算符时,它为您提供整个数组的大小,即sizeof(int [4])
在这种情况下。
&arr
是类型int (*)[4]
,它是一个指针。
因此,要获取数组中元素的数量,您应该执行以下操作
printf ("Number of elements = %zu", sizeof(arr)/sizeof(arr[0])); / *(size of the entire array / size of one element in the array) */
引用C11
,第§6.3.2.1章(重点是我的)
除了当它是的操作数
sizeof
操作者,所述_Alignof
操作者,或一元&
运算符,或者是用于初始化数组字符串文字具有类型的表达式“”类型的数组“”被转换成类型的表达式“”类型指针''指向数组对象的初始元素,不是左值。[...]
那就是
sizeof
产生类型为的结果size_t
,您应该使用%zu
格式说明符来打印结果。
要打印指向对象的指针,必须使用%p
格式说明符并将相应的参数强制转换为void *
。