Если выражение type name[count]
записано в какой-то функции, то вы указываете компилятору C выделить sizeof(type)*count
байты кадра стека и вычислить адрес первого элемента в массиве.
Если выражение type name[count]
написано вне всех функций и структурирует определения, то вы указываете компилятору C выделить sizeof(type)*count
байты сегмента данных и вычислить адрес первого элемента в массиве.
name
на самом деле это константный объект, который хранит адрес первого элемента в массиве, и каждый объект, который хранит адрес какой-либо памяти, называется указателем, поэтому эту причину вы рассматриваете name
как указатель, а не как массив. Обратите внимание, что массивы в C могут быть доступны только через указатели.
Если count
это константное выражение, которое оценивается как ноль, то вы указываете компилятору C выделить нулевые байты либо в кадре стека, либо в сегменте данных и вернуть адрес первого элемента в массиве, но проблема заключается в том, что первый элемент массива нулевой длины не существует, и вы не можете вычислить адрес чего-то, что не существует.
Это рационально, что элемента нет. count+1
не существует в count
массиве с длинной длиной, так что это причина, по которой компилятор C запрещает определять массив нулевой длины как переменную внутри и снаружи функции, потому что в чем тогда содержимое name
? Какой адрес name
хранит именно?
Если p
указатель, то выражение p[n]
эквивалентно*(p + n)
Когда звездочка * в правом выражении является операцией разыменования указателя, что означает доступ к памяти, на которую указывает указатель, p + n
или доступ к памяти, адрес которой хранится p + n
, где p + n
указатель выражения, он берет адрес p
и добавляет к этому адресу число, n
умноженное на размер типа указателя p
.
Можно ли добавить адрес и номер?
Да, это возможно, потому что адрес представляет собой целое число без знака, обычно представляемое в шестнадцатеричном формате.