В Си, почему ссылка на массив a + = 2; неверный код - PullRequest
3 голосов
/ 29 сентября 2010

Из моих слайдов лекций говорится:

Как показано в приведенном ниже коде, имени массива можно присвоить
соответствующему указателю без необходимости использования оператора &.

int x;  
int a[3] = {0,1,2};  
int *pa = a;  
x = *pa;  
x = *(pa + 1);  
x = *(pa + 2);  
a += 2; /* invalid */  

Почему a += 2; недействительно?

Может кто-нибудь помочь уточнить?
Также не стесняйтесь редактировать заголовок, если вы думаете о лучшем.

Ответы [ 4 ]

8 голосов
/ 29 сентября 2010

a += 2 переводится на a = a + 2. Добавление числа в массив - это то же самое, что добавление числа к указателю, который действителен и дает новый указатель.

Проблема в присвоении - массивы не являются lvalues, поэтому вы ничего не можете им присвоить. Это просто запрещено. И даже если бы вы могли найти здесь несоответствие типов - вы пытаетесь назначить указатель на массив, который не имеет смысла.

7 голосов
/ 29 сентября 2010

a += 2; недопустим, потому что оператор += не определен для массивов. Кроме того, массивы не могут быть изменены lvalues, поэтому вы не можете назначить их.

2 голосов
/ 29 сентября 2010

Когда вы передаете a в функцию, где ожидается указатель, используется адрес a. Это приводит к неправильному утверждению, массив и указатель являются взаимозаменяемыми.

Но

  • это массив
  • Па - указатель

Так как pa - скаляр, вы можете изменить его с помощью

pa = pa + 2;

или

pa += 2;

Массив a не определяет никаких операций, таких как

a = a + 2;  /* invalid */
0 голосов
/ 29 сентября 2010

когда вы пишете + = 2, тогда оно переводится в a = a + 2.

Таким образом, это означает, что вы изменяете базовый адрес массива.Это не разрешено в c, потому что если вы измените базовый адрес массива, то как вы получите доступ к элементу массива.

Это даст Lvalue требуемую ошибку во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...