Почему 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.