Как правильно использовать указатели в функциях C ++? - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь освоить указатели и адреса в C ++, и у меня возникают проблемы с функциями с изменением параметров.

Код ниже пишет Loop run #1. в бесконечном цикле, вместо увеличения значения foo.

Мой вопрос: В чем проблема с этим кодом здесь?

#include <iostream>

void Statement(int *foo) {
    std::cout << "Loop run #" << *foo << ". ";
    foo++;
}

int main() {

    int foo = 1;

    for (;;) {
        Statement(&foo);
    }

}

Ответы [ 3 ]

8 голосов
/ 28 июня 2019

Вы увеличиваете копию самого указателя, а не того, на что он указывает. Вы, вероятно, имели в виду:

(*foo)++;

Это все равно не исправит бесконечный цикл, потому что вам не с чем его остановить.

5 голосов
/ 28 июня 2019

Ваша проблема заключается в том, что вы увеличиваете указатель, а не указываемые данные.

замена

foo++

с

(*foo)++

для увеличения указанного значения.

1 голос
/ 28 июня 2019

Если я правильно понял, что вы пытаетесь сделать, тогда функцию следует объявить следующим образом, как показано в демонстрационной программе

#include <iostream>

void Statement(int *foo) {
    std::cout << "Loop run #" << *foo << ". ";
    ++*foo;
}

int main() {

    int foo = 1;

    for (; ; ) {
        Statement(&foo);
    }
}

То есть в бесконечном цикле вы пытаетесьвыходное инкрементное значение foo.

. В этом случае вы сами увеличиваете значение, на которое указывает указатель, например

++*foo

Если вы хотите ограничить итерации цикла, вы можете использовать дляПример объекта типа unsigned char и определения цикла следующим образом

#include <iostream>

void Statement( unsigned char *foo) {
    std::cout << "Loop run #" << int( *foo ) << ". ";
    ++*foo;
}

int main() {

    unsigned char foo = 1;

    for (; foo ; ) {
        Statement(&foo);
    }
}
...