#c #pointers
#c #указатели
Вопрос:
Я совершенно новичок, и мне трудно переваривать раздел указателей в C .
Я понял следующее:
чтобы получить доступ к содержимому адреса, используйте *
чтобы получить доступ к адресу содержимого, используйте amp;
Итак, в основном мой вопрос таков: почему приведенные ниже коды выдают ошибки?
int x = 10;
int *pt;
*pt = x;
Почему я должен кодировать в форматах, подобных приведенному ниже?
int x = 10;
int *pt;
pt = amp;x;
Также я не могу понять *pt = amp;x;
строку. *pt
должно быть содержимое, а не адрес. Почему это нормально?
int x = 10;
int *pt = amp;x;
Аналогично, чтобы использовать temp
один и тот же адрес n1
, я думаю, это должно быть
int n1 = 1;
int amp;temp = amp;n1;
но в учебнике говорится, что правильный код приведен ниже.
int n1 = 1;
int amp;temp = n1;
Нужна ПОМОЩЬ!
Комментарии:
1. Вы должны быть осторожны:
pt = amp;x;
: Here ,amp;
является частью выражения , которое делает его оператором адреса.int amp;temp = n;
: Здесьamp;
является частью объявления , которое делает его модификатором (ссылочным типом). Это не единственный случай в C . Есть похожие случаи с*
(в выражении оператор разыменования против в объявлении модификатора типа для указателя) и=
(в выражении присваивание, но в объявлении для инициализации), чтобы назвать некоторые, которые сразу пришли мне в голову.2. (1)
int *pt; *pt = x;
Чтобы это сработало, вам сначала нужно присвоить адрес существующей переменнойpt
(so,pt = amp;...;
) . (2)int *pt = amp;x;
это эквивалентноint *pt; pt = amp;x;
, а неint *pt; *pt = amp;x;
.3. В общем случае a
pointer
— это переменная, в которой ее значением является адрес другой переменной.
Ответ №1:
Вы путаете значение *
и amp;
в выражении с их значением в объявлении типа переменной. В тип переменной *
просто означает, что эта переменная является указателем, в то время amp;
как означает, что это ссылка, например:
int *pt = amp;x;
на самом деле означает «объявить указатель на int
с именем pt
и присвоить ему адрес x
«. В то время как
int amp;temp = n1;
означает «объявить ссылку на int
named temp
и присвоить n1
ей, чтобы temp
она ссылалась на ту же память, n1
что и «.
Ответ №2:
Я думаю, вы путаете значение ‘amp;’ и ‘*’.
В двух словах,
amp;x: чаша x-адреса. * pt: ответвление для выбора адреса (только адрес).
И если вы объявляете как ‘int *pt’, вам не нужно объявлять как ‘* pt=amp;x’. Потому что ‘pt’ уже является переменной указателя.
Ответ №3:
Указатель — это «ссылка на память для определенного типа». В примере, который вы написали int *pt;
, вместо этого попробуйте подумать об этом как:
int x = 10;
// Declare a pointer to location in memory.
// That memory is holding (or will be) value of type int.
int* pt;
// What would be be the meaning of this? *pt doesn't really mean anything.
// int* means that it is points to type of integer
*pt = x;
Аналогичный подход для amp;x
, который является только ярлыком для:
- «Я знаю, что существует переменная
x
типаint
, и я хотел бы получить адрес (первого байта этого int)».
// Again from the example, you declare int x to value 10.
int x = 10;
// Declare pointer for int type.
int* pt;
// Set pointer (variable that specifies the location in memory)
// to address of variable x (so you point "pointer pt" to location in memory
// where variable x sits
pt = amp;x;
Наконец, если вы соедините точки:
int x = 10;
// 1st declare pointer of type int
// point the pointer to the value x
int* pt = amp;x;
Ответ №4:
почему приведенные ниже коды выдают ошибки?
1> int x = 10; 2> int *pt; 3> *pt = x;
*pt
в строке 3 обращается int
к объекту, на который указывает by pt
, но в это время значение pt
не определено.
Почему я должен кодировать в форматах, подобных приведенному ниже?
int x = 10; int *pt; pt = amp;x;
Назначьте указатель, который указывает на x
to pt
, так что теперь указатель pt
указывает на x
.
Также я не могу понять * pt = amp;x; строка. *pt должно быть содержимым, а не адресом. Почему это нормально?
int x = 10; int *pt = amp;x;
Нет, pt
это переменная и int *
ее тип. Этот код имеет то же значение, что и предыдущий.
Аналогично, чтобы заставить temp использовать один и тот же адрес с n1, я думаю, это должно быть
int n1 = 1; int amp;temp = amp;n1;
но в учебнике говорится, что правильный код приведен ниже.
int n1 = 1; int amp;temp = n1;
int amp;
это ссылочный тип C , он не является указателем, поэтому amp;
оператор не нужен для получения адреса n1
. В это время pt
уже привязан к n1
.