Два вопроса о простой загадочной функции с указателями - PullRequest
0 голосов
/ 29 января 2020

Мой класс в настоящее время изучает указатели в C, и нас попросили объяснить, что делает приведенная ниже функция, учитывая массив и его длину. В настоящее время я понимаю, что он создает указатель * x, который указывает на первый элемент в массиве, затем он создает другой указатель * y, который указывает на конец массива. Однако остальное я не понимаю. Я подведу итоги по моим вопросам:

1-й: Что в это время проверяет я oop? Другими словами, что означает (x

2nd: while l oop просто инвертирует массив? Если так, как значения x и y увеличиваются? Я не вижу возможности для * x и * y ссылаться на какие-либо элементы, кроме первого и последнего элемента в массиве.

void mystery(int arr[], int len) {
    int *x = arr;
    int *y = arr + len - 1;
    while (x < y) {
        int t = *x;
        *x = *y;
        *y = t;
    }
}

Заранее благодарим вас за понимание и знания.

Ответы [ 2 ]

2 голосов
/ 29 января 2020

… создает указатель, * x,…

Нет, x - указатель. *x это то, на что он указывает.

… что означает (x

x < y проверяет, указывает ли x на что-то раньше чем y. (Это определяется только в том случае, если x и y указывают на один и тот же массив, структуру или объединение.) В массиве элемент является более ранним, чем другой, если он имеет более низкий индекс. В структуре член является более ранним, чем другой, если он объявлен ранее в определении структуры. В объединении ни один член не является более ранним, чем любой другой.

Является ли в то время, как l oop просто инвертирует массив?

Код l oop не работает , Он никогда не изменяет x или y, поэтому он никогда не изменяет, оценивается ли условие x < y как истинное, поэтому, если введено значение l oop, оно никогда не завершается. Это похоже на код, который, возможно, был предназначен для обращения элементов массива. Если вы измените его на:

while (x < y)
{
   int t = *x;
   *x++ = *y;
   *y-- = t;
}

, то на каждой итерации он продвигается x и тормозит y. В середине массива они будут равны (если есть нечетное количество элементов) или пересекутся (если есть четное количество элементов). В любом случае, x < y будет тогда ложным, и l oop остановится, поменяв местами каждый элемент спереди с элементом в отраженном положении сзади, таким образом полностью изменив содержимое массива.

0 голосов
/ 29 января 2020

Вышеприведенная функция как есть не меняет массив, так как x и y не изменяются, вызывая зависание программы на while l oop.

Для решения проблемы , указатель x должен быть увеличен, в то время как указатель y должен быть уменьшен. Когда они становятся равными, выражение внутри while l oop оценивается как ложное, тем самым нарушая l oop.

l oop должно выглядеть следующим образом:

while(x < y) 
{
    int t = *x;
    *x++ = *y;
    *y-- = t;
} 
...