Давайте рассмотрим сложный пример для удовольствия. Скажем, мы в
char a[10][20][30] = { };
Размер a
будет sizeof(char) * 10 * 20 * 30
; так sizeof(a)
= 6000 (as per C99 standard). a
можно рассматривать как массив из (10) массива (20) массива из (30) символов. Теперь
a[0]
будет один размер меньше, что дает нам множество (20) массива (30) символов
a[0][0]
даст нам множество (30) символов
a[0][0][0]
является характер.
Во всех этих примерах 0
- не что иное, как первый элемент соответствующего уровня массива.
Теперь найти длину массива, выполнив sizeof(a)/sizeof(a[0])
, является трюком, укорененным в логике выше. sizeof(a[0])
- это не что иное, как размер массива из 20 массивов из 30 символов, что составляет 600. sizeof(a)/sizeof(a[0])
= 6000/600 = 10, что возвращает длину первого измерения. Аналогичную математику можно сделать и для более высоких измерений.
Поскольку в вашем вопросе у вас есть указатель типа char*
, то в качестве базового фактора следует использовать sizeof(char*)
, который умножается на длины каждого измерения. Размер типа указателя зависит от типа машины/архитектуры и используемого вами компилятора.
У каждого из нас будут разные машины и разные компиляторы, работающие на них, поэтому нам нужна общая ссылка для объяснения. Запуск вашей программы в online compiler gives the result40/8 = 5
. как я уже говорил выше, в зависимости от платформы и компилятора размер указателя будет отличаться.
Как вы писали в комментарии, ваш массив имеет тип char* [5][2]
.Отсрочка с [0]
удалит один уровень, и у нас есть char* [2]
; таким образом, sizeof(var[0]) = sizeof(char* [2])
= 8, скажем, что размер двух указателей на символы равен 8, что означает, что sizeof(char*)
равно 4 на этом онлайн-машине. На этой основе sizeof(var)
= 4 * 5 * 2 = 40, что мы видим на выходе, тем самым справедливо давая первую длину массива как 5.
Теперь ваш вывод, например mentioned by glglgl, немного отличается (возможно, ваш машина или модель данных компилятора - 16 бит); машина, с которой вы работаете в сочетании с вашим компилятором, кажется, дает как размер указателя char i.e sizeof(char*) = 2
. Теперь, когда вы делаете var[0]
, у нас есть char* [2]
; его размер равен sizeof(char*) * 2
= 2 * 2 = 4. Аналогично sizeof(var)
= 2 * 5 * 2 = 20. Таким образом, вы получаете 20/4 = 5
как выход.
Как я могу узнать, сколько бит у меня есть на элемент 1-го измерения, я имею в виду подсчет?
В char* [5][2]
каждый элемент первого измерения является типом char* [2]
, таким образом, это размер 2 * sizeof(char*)
.
Надеюсь, это поможет!
Этим значениям трудно поверить. Я получаю '40/8 = 5' на 32-битной машине. 40 - общий размер, 8 - размер одной записи (которая является символом 'char * [2]', поэтому у меня есть 5 элементов в первом измерении. Если вы делаете то же самое в одной строке, вы получаете '8/4 = 2', потому что одна строка состоит из 2 записей с 4 байтами каждый. – glglgl
На 64-битной машине результаты: '80/16 = 5' соответственно. 16/8 = 2'. – glglgl
Возможно, ваш результат исходит из прежняя версия вашей программы, в которой в массиве было меньше одного десятичного разряда. – glglgl