Адрес оператора и L-значения в с - PullRequest
0 голосов
/ 28 октября 2018

Если я запускаю следующий код:

int main(){
    int x = 0;
    int* y = &x;
    &x = y;
}

Я получаю ошибку:

lvalue требуется в качестве левого операнда присваивания

Iпонимать, что это означает, что при использовании оператора addressof созданный указатель не является допустимым lvalue, как это отражено в документации c.

Мой вопрос просто: почему?

По какой причине я не могу изменить значение указателя на мою переменную x?Это для того, чтобы программист не допустил ошибок, или это принципиально не имеет смысла (в этом случае, пожалуйста, объясните почему.)

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Здесь & оператор дает вам адрес переменной x, и вы пытаетесь присвоить что-то этому адресу, но это невозможно, это не имеет смысла.
Если вы хотите изменитьзначение сохраняется в x, просто присвойте ему:

x = 5;

Если у вас есть указатель (int*) y и вы хотите присвоить его значение x, используйте *оператор, чтобы получить значение y, на которое указывает (сохраненный в этом адресе) и присвоить его x:

x = *y;

Если вы хотите назначить указатель y на x, это невозможно.Для этого используйте другой указатель.

int *y1 = y;
0 голосов
/ 28 октября 2018

в вашем коде

&x = y

В этой строке отображается ошибка, поскольку & x является постоянным указателем и, следовательно, не может быть изменен после его инициализации

0 голосов
/ 28 октября 2018

В этой строке:

&x = y;

Звучит так, как будто вы пытаетесь сказать «Я хочу, чтобы x был сохранен по адресу y».

  1. Когда вы объявляете переменную (x), ее адрес (то, что вы называете «значением указателя») является постоянным значением.Это не «lvalue».(«l» для «left», левая часть операции присваивания, поэтому что-то присваиваемое.)
  2. Также вы не должны сами решать, где система устанавливает данные в памяти.
  3. Кроме того, вы даже не уверены, что адрес "y" является выделенным местом, разрешенным для записи вашим процессом.

Здесь есть три причины, по которым вы не можете этого сделать.:)

...