Если выражение 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.
Можно ли добавить адрес и номер?
Да, это возможно, потому что адрес представляет собой целое число без знака, обычно представляемое в шестнадцатеричном формате.