//example 1
int y = 100;
//example 2
int *y = 100;
//Example 3: epic confusion!
int *y = &z;
Я думаю, что проблема для большинства студентов в том, что в C ++ оба значения &
и *
имеют разные значения, в зависимости от контекста, в котором они используются.
Если либоиз них появляется после типа в объявлении объекта (T*
или T&
), они являются модификаторами типа и изменяютсятип от простого T
до ссылка на T
(T&
) или указатель на T
(T*
) .
Если они появляются перед объектом (&obj
или *obj
), они одинарныепрефиксные операторы , вызываемые на объекте.Префикс &
возвращает адрес объекта , для которого он вызывается, *
разыменования указатель, итератор и т. Д., получая значение, на которое оно ссылается.
Это не помогает избежать путаницы в том, что модификаторы типа применяются к объявленному объекту, а не к типу.То есть T* a, b;
определяет T*
с именем a
и простой T
с именем b
, поэтому многие люди предпочитают вместо этого писать T *a, b;
(обратите внимание на расположение модифицирующего тип *
рядом с определяемым объектом, а не с измененным типом).
Также бесполезно то, что термин «ссылка» перегружен.С одной стороны, это означает синтаксическую конструкцию, как в T&
.Но есть также более широкое значение «ссылки», являющейся чем-то, что относится к чему-то другому.В этом смысле и указатель T*
, и ссылка (другое значение T&
) являются ссылками в том смысле, что они ссылаются на некоторый объект.Это вступает в игру, когда кто-то говорит, что «указатель ссылается на некоторый объект» или что указатель «разыменован».
Так что в ваших конкретных случаях # 1 определяет простой int
, # 2 определяет указатель на int
и инициализирует его с адресом 100
(все живые существа, вероятно, лучше оставить нетронутыми)и # 3 определяет другой указатель и инициализирует его адресом объекта z
(также обязательно int
).
A о том, как передавать объекты в функции в C ++, здесь - мой старый ответ на этот вопрос.