Почему sizeof (array) и sizeof (&array[0]) дают разные результаты?

#include <stdio.h>
int main(void){
    char array[20];

    printf( "nSize of array is %dn", sizeof(array) );  //outputs 20
    printf("nSize of &array[0] is %dn", sizeof(&array[0]); //output 4
}

код выше дает 20 на sizeof(array) и 4 на sizeof(&array[0]).

то, что я знал, вместо того, чтобы давать массив в качестве аргумента, его первый элемент может быть передан. Разве они не должны давать тот же результат, что и 20? и почему?--5--> 4 дает в результате? насколько я знаю, char хранится в 1 байте?

6 ответов


в выражении sizeof array, array не преобразуется в тип указателя.

C11, § 6.3.2.1 Lvalues, массивы и обозначения функций

за исключением когда это операнд sizeof оператор на _Alignof оператор, или унарный оператор&, или строковый литерал, используемый для инициализации массива, выражение с типом "массив типа" преобразуется в выражение с типом " указатель на тип’, который указывает на начальный элемент объекта array и не является lvalue.

следовательно, его тип char[20], а не char *. Размер этого типа является sizeof(char) * 20 = 20 байт.

С11, § 6.5.3.4 В sizeof и _Alignof операторы

на sizeof оператор возвращает размер (в байтах) своего операнда, который может быть выражение или имя типа, заключенное в скобки. размер определяется по типу операнд!--21-->.

&array[0] тип char *. Вот почему sizeof(&array[0]) дает тот же результат, что и sizeof(char *) (4 байта на вашей машине).


переменная array - это массив из 20 char значение выражения sizeof(array) равно размеру байтов массива 20 chars, которая составляет 20.

&array[0] это указатель. The sizeof возвращает размер указателя, который равен 4 в вашем компьютере.


выражение &array[0] Это указатель так sizeof оператор возвращает размер указателя.


sizeof(array) дает вам размер общего массива и sizeof(&array[0]) дает вам sizeof(char *)

ваш вопрос является прекрасным примером Array and pointer are not same. Массив может выступать в качестве указателя.посмотреть здесь.


sizeof(&array[0]) возвращает размер указателя на char. array[0] дает голец & возвращает указатель на char. Ваш компилятор использовал 4 байта для указателя (32 бит).


&array[0] возвращает указатель на первый индекс массива. С помощью sizeof оператор на указателе даст размер указателя (зависит от ABI), в вашем случае это 4.