Отслеживание указателей - PullRequest
       16

Отслеживание указателей

0 голосов
/ 21 февраля 2010

Я реализую стандартный алгоритм пузырьковой сортировки, и у меня возник вопрос по указателям.

float *SortValues(float *p, size_t n)
{
    float temp;
    float didSwap;
    float *current;
    float *last = &p[n - 1];
    float *start = p;

    do 
    {
        for (didSwap = 0, current = p; current < last; current++) {
            if (current[0] > current[1]) {
                temp = current[0];
                            current[0] = current[1];
                current[1] = temp;
                didSwap = 1;
            }
        }
        --last;
    }

    while (didSwap);
    return start;
}

Я часто путаюсь, используя другие указатели для указания начала и / или конца переданного указателя. В чем-то похожем на приведенный выше код я устанавливаю current для указания p и начинаю указывать на p Ток меняется на протяжении всего цикла. Поскольку current и p указывают на одно и то же, как p и, следовательно, начинают переходить к указанию на то же самое, что и current?

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

Где указывает начало, не меняется. На что указывает start.

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

Последний раз в цикле while, когда last == start, выполняется только инициализация цикла for, так что current == p при выходе из цикла while.

0 голосов
/ 21 февраля 2010

Подписки против указателей


В настоящее время код написан с использованием гибридного подхода, который использует некоторую подписку и некоторую адресацию указателя.

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

В этом отношении может быть написано использование полностью указателей без подписки.

Я не жалуюсь на текущую организацию, которая выглядит просто отлично, я просто говорю, что она может пролить некоторый свет на реализацию, чтобы увидеть, как она выполняется в обоих направлениях в чистом виде.

Но чтобы ответить на ваш вопрос, имейте в виду, что список всегда находится в одном и том же месте, просто значения элементов меняются местами. Таким образом, начало списка всегда в одном и том же месте, но оно не всегда имеет одинаковое содержимое. Приятно, что в вашем уме встроена такая объектно-ориентированная картина, но в этом случае, возможно, она не очень хорошо вам подходит. В конечном счете, структуры данных - это просто массивы битов по определенным адресам ...

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