2012-03-05 6 views
0

Я тренируюсь для среднего уровня C++, и я не понимаю, почему следующий код неверен.C++ Указатель указателя/массива

int ip[] = {6, 7, 2, 4, -5}; 
for (int i = 0; i < 5; ++i, ++ip) 
    cout << *ip; 

Я подозреваю, что это что-то делать с -5, но я потерял, и я бы очень хотел, чтобы решить это.

+0

переменной массива эквивалентен постоянная указатель. Поэтому его нельзя каким-либо образом увеличивать или модифицировать. – Pramod

+0

@Pramod Нет, переменная массива * не * эквивалентна указателю константы. Например, 'sizeof (array)' обычно не совпадает с 'sizeof (pointer)'. – fredoverflow

ответ

3

Вы не можете увеличить ip, так как это массив, а не указатель - поэтому его значение [ip] исправлено.

Таким образом, проблема с выражением ++ip

+0

Я думал, что указатели похожи на массивы в C++ – Zack

+0

Это не так, массивы имеют специальную семантику. Вы также можете проверить, что такое значение '& ip' [ответ' & ip == ip'], что неверно для указателей. – amit

+1

@ Zack: Это распространенное заблуждение. Лучше сказать, что значение указателя может быть получено из любого массива, и эти указатели могут использоваться для имитации массивов с использованием арифметики указателей (так что они, безусловно, * выглядят очень похожими). Но для самого языка указатели и массивы очень разные. – Jon

1

Ошибка в том, что вы не можете увеличить значение статического указателя, он же массив.

Простым решением является простое использование оператора индексирования [].

int ip[] = {6, 7, 2, 4, -5}; 
for (int i = 0; i < 5; i++) 
    cout << ip[i]; 
+0

ах, я вижу. В этом есть смысл – Zack

1

Вы можете получить доступ к этим элементам непосредственно с помощью индекса:

int ip[] = {6, 7, 2, 4, -5}; 
for (int i = 0; i < 5; ++i) 
    cout << ip[i]; 

или если вы хотите использовать арифметические операции над указателями для этой цели можно использовать временную переменную - указатель, который будет указывать на первый элемент этот массив:

int ip[] = {6, 7, 2, 4, -5}; 
int* myPtr = ip; 
for (int i = 0; i < 5; ++i, ++myPtr) 
    cout << *myPtr; 

Обратите внимание, что int* myPtr = ip; равно int* myPtr = &ip[0].

0

ip - статический массив .. вы не можете его увеличить! в конце концов, вы можете создать еще один указатель, который указывает на ip:

int* p = ip; 

затем увеличить p.

0

вам необходимо увеличить каждое значение ф массива [] отдельно

0

Указатели и массивы различных вещей. Указатели распадаются на массивы, но это не работает наоборот. Оператор ++ не определен на массивах, поэтому ip распадается на указатель, указатель (неназванный временной) увеличивается, но вы не можете сохранить его обратно в ip, потому что ip является массивом.

Код, приведенный ниже, должен работать, как вы ожидаете.

#include <iostream> 

int main(){ 
     int ip[] = {6, 7, 2, 4, -5}; 
     int *p=ip; 
     for (int i = 0; i < 5; ++i, ++p) 
      std::cout << *p; 
} 
0

Просто оформить несколько то, что говорят другие: ip является массивом, а не указатель. Он неявно преобразуется в указатель, но результаты неявного преобразования представляют собой rvalue, а оператору ++ требуется значение lvalue. Помимо неявного преобразования (которое не встречается во всех контекстах ), между массивами и указателями нет реальной взаимосвязи.

Обратите внимание, что в C++ [] не определен для типов массивов, только для указателей (или для типов с определенными пользователем перегрузками). Он работает только с массивами из-за неявного преобразования.

1

Причина этого заключается в том:

  1. , когда речь идет о массиве ip[], внутрибрюшинно указывает на первый элемент массива и является фиксированной и не может быть изменен (это подобно константный указатель, указывающие на то определенное место памяти.)

    2.so когда вы приращение его вы нарушаете условия, поэтому вы получаете ошибку

попробовать это вместо

int ip[] = {6, 7, 2, 4, -5}; 
for (int i = 0; i < 5; ++i) 
    cout << ip[i]; 
Смежные вопросы