Здесь никто до сих пор не упомянул, что эта звездочка на самом деле является « оператором разыменования » в C.
*a = 10;
Строка выше не означает, что я хочу назначить 10
для a
, это означает, что я хочу назначить 10
для любой области памяти, на которую указывает a
. И я никогда не видел, чтобы кто-нибудь писал
* a = 10;
ты? Так что оператор разыменования почти всегда пишется без пробела. Это, вероятно, чтобы отличить его от умножения, разбитого на несколько строк:
x = a * b * c * d
* e * f * g;
Здесь *e
будет вводить в заблуждение, не так ли?
Хорошо, теперь, что на самом деле означает следующая строка:
int *a;
Большинство людей скажут:
Это означает, что a
является указателем на значение int
.
Это технически правильно, большинству людей нравится видеть / читать его таким образом, и именно так его определяют современные стандарты C (обратите внимание, что язык C сам по себе предшествует всем стандартам ANSI и ISO). Но это не единственный способ взглянуть на это. Вы также можете прочитать эту строку следующим образом:
Разыменованное значение a
имеет тип int
.
Так что на самом деле звездочка в этом объявлении также может рассматриваться как оператор разыменования, что также объясняет его размещение. И то, что a
является указателем, на самом деле вообще не объявляется, это подразумевается тем фактом, что единственное, что вы можете разыменовать - это указатель.
Стандарт C определяет только два значения для оператора *
:
- оператор косвенного обращения
- оператор умножения
И косвенность - это просто одно значение, для объявления указателя нет никакого дополнительного значения, есть только косвенность, то есть то, что делает операция разыменования, она выполняет косвенный доступ, так же как и внутри оператора вроде int *a;
является косвенным доступом (*
означает косвенный доступ), и, следовательно, второе приведенное выше утверждение намного ближе к стандарту, чем первое.