Почему 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 в вашем компьютере.
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.