Почему возвращаемое значение целочисленного размера массива (массива) всего в 4 раза превышает количество элементов? - PullRequest
0 голосов
/ 04 июня 2019

Например, если я сделаю следующее,

int array[5] = {1, 2, 3, 4, 5};
printf("%d", sizeof(array));

Возвращается 4 раза # элементов, что равно 5 = 20.

Но мой вопрос: для массивов не нужны указатели? (Адрес) Если так, то, поскольку указатели имеют размер 8 байт, почему они не включены в размер?

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Но мой вопрос: не требуют ли указатели для массивов? (Адрес)

Нет. Массив - это просто последовательность объектов - в данном случае последовательность 5 int:

       +–––+
array: | 1 | array[0]
       +–––+
       | 2 | array[1]
       +–––+
       | 3 | array[2]
       +–––+
       | 4 | array[3]
       +–––+
       | 5 | array[4]
       +–––+

Нет места для любого указателя - выражение array будет преобразовано («затухание») в выражение указателя, так что оно будет вычислено по адресу первого элемента (если только оно является операндом операторов sizeof или унарных &).

Если это так, так как указатели имеют размер 8 байт, почему они не включены в размер?

Не предполагайте, что указатели имеют определенный размер - все еще используются 16- и 32-разрядные системы, и указатели на разные типы не обязательно должны иметь одинаковый размер и представление. Весь мир не VAX x86-64.

0 голосов
/ 05 июня 2019

на примере массива [5] для массивов типа float и int он показывает размер равным 20 (в то время как размер с плавающей точкой равен 4, а int равен 2, оба, похоже, имеют одинаковое значение космос не знаю почему) при условии, что 32-битная машина имеет указатель размера 4, массив равен 4 * 5 = 20. но для массива типа char размер равен 5 (т.е. на этот раз не умножено на 4) на этот раз на той же машине размер указателя должен быть 1 в соответствии с выводом. а для массива типа double размер равен 40 (5 * 8), поэтому размер указателя должен быть 8

то есть это не только 4 для 32 бит или 8 для 64, но это также отличается для разных типов данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...