#c
Обычно делают так: sizeof/ sizeof [0] Но ведь, — указатель на первый элемент ( == & [0]). Тогда почему sizeof возвращает корректный размер массива. Нигде же не хранится его размер.
Ответы
Ответ 1
Если name_array объявлен именно как массив, то объект name_array - не указатель на первый элемент. name_array - это именно массив. Значение типа массив, однако, может неявно приводиться к указателю на свой первый элемент. И в языке С массив действительно сам по себе неявно приводится к указателю на свой первый элемент во всех контекстах, за исключением четырех Операнд оператора sizeof Операнд унарного оператора & Строковый литерал-инициализатор для символьного массива Операнд оператора _Alignof Ваш случай - как раз один из тех, в которых массив остается массивом. Поэтому sizeof возвращает размер массива, а не размер указателя. Ваше замечание про "Нигде же не хранится его размер" не совсем понятно. "Классический" sizeof является выражением (константой) времени компиляции. Размер любого типа, разумеется, известен компилятору на стадии компиляции. sizeof же примененный к VLA вычисляется во время выполнения, но размер VLA как раз таки действительно хранится во время выполнения.Ответ 2
Указатель и массив - не одно и то же. В качестве примера: #includeint main(void) { int arr[] = {0, 1, 2, 3}; printf("%d\n", sizeof(arr)/sizeof(arr[0])); int* parr = arr; printf("%d\n", sizeof(parr)/sizeof(parr[0])); return 0; } Вывод: 4 1 Я не нашел авторитетного источника, но похоже, имя массива и указатель являются синонимами и действуют одинаково, за исключением следующих случаев: Оператор sizeof - см. выше. Инициализация строковыми литералами: char arr[] = "abc"; // эквивалентно char arr[] = {'a', 'b', 'c', '\0'}; char *parr = "abc"; // указатель на некоторую (неизменяемую) область памяти, правильнее const char* parr = "abc"; arr[0] = 'A'; // OK parr[0] = 'A'; // неопределенное поведение Указатель можно присваивать или изменять, массив нет (массив не является lvalue): parr = arr; // OK arr = parr; // не скомпилируется parr++; // OK arr++; // не компилируется
Комментариев нет:
Отправить комментарий