Почему 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 бит).