C ++ указатель / различие массива - PullRequest
0 голосов
/ 05 марта 2012

Я тренируюсь на промежуточном этапе c ++, и я не могу понять, почему следующий код неверен.

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

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

Ответы [ 8 ]

3 голосов
/ 05 марта 2012

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

Итак, проблема в выражении ++ip

1 голос
/ 08 марта 2012

Причина этого:

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

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

попробуйте вместо этого

int ip[] = {6, 7, 2, 4, -5};
for (int i = 0; i < 5; ++i)
    cout << ip[i];
1 голос
/ 05 марта 2012

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

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

1 голос
/ 05 марта 2012

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

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

int ip[] = {6, 7, 2, 4, -5};
for (int i = 0; i < 5; i++)
    cout << ip[i];
0 голосов
/ 05 марта 2012

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

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

0 голосов
/ 05 марта 2012

Указатели и массивы - это разные вещи. Указатели распадаются на массивы, но не работают наоборот. Оператор ++ не определен для массивов, поэтому 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 голосов
/ 05 марта 2012

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

0 голосов
/ 05 марта 2012

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

int* p = ip;

, а затем увеличивается p.

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