Почему sizeof (array) и sizeof (& array [0]) дают разные результаты?
#include <stdio.h>
int main(void){
char array[20];
printf( "\nSize of array is %d\n", sizeof(array) ); //outputs 20
printf("\nSize of &array[0] is %d\n", sizeof(&array[0]); //output 4
}
Код выше дает 20
для sizeof(array)
и 4
для sizeof(&array[0])
.
Я знал, что вместо массива в качестве аргумента его первый элемент можно передать. Разве они не должны давать такой же результат, как 20? и почему &array[0]
дает 4 в качестве результата? Насколько я знаю, char хранится в 1 байте?
Ответы
Ответ 1
В выражении sizeof array
, array
не преобразуется в тип указателя.
C11, § 6.3.2.1 Lvalues, массивы и обозначения функций
За исключением , когда он является операндом оператора sizeof
, оператором _Alignof
или унарным и оператором, или является строковым литералом, используемым для инициализации массива, выражение, которое имеет type '' преобразуется в выражение с типом '' указателем на тип, указывающим на начальный элемент объекта массива и не является lvalue.
Следовательно, его тип char[20]
, а не char *
. Размер этого типа составляет sizeof(char) * 20 = 20
байт.
C11, § 6.5.3.4 Операторы sizeof
и _Alignof
Оператор sizeof
дает размер (в байтах) своего операнда, который может быть выражение или имя в скобках типа. Размер определяется по типу операнда.
&array[0]
Тип char *
. Поэтому sizeof(&array[0])
дает тот же результат, что и sizeof(char *)
(4 байта на вашем компьютере).
Ответ 2
Переменная array
представляет собой массив из 20 char
, значение выражения sizeof(array)
равно размеру байтов массива из 20 chars
, который равен 20
.
&array[0]
является указателем. sizeof
возвращает размер указателя, который равен 4 на вашем компьютере.
Ответ 3
Выражение &array[0]
является указателем, поэтому оператор sizeof
возвращает размер указателя.
Ответ 4
sizeof(array)
дает вам размер общего массива, а sizeof(&array[0])
дает вам sizeof(char *)
Ваш вопрос - прекрасный пример Array and pointer are not same
. Массив может действовать как указатель. Посмотрите здесь.
Ответ 5
&array[0]
возвращает указатель на первый индекс массива. Использование оператора sizeof
на указателе даст размер указателя (зависит от ABI), в вашем случае это 4.
Ответ 6
sizeof(&array[0])
возвращает размер указателя на char. array[0]
дает char, &
возвращает указатель на char. Ваш компилятор использовал 4 байта для указателя (32 бит).