* pt = x; не работает (значение * и

#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 .