Нужна помощь в понимании указателей в c - PullRequest
0 голосов
/ 08 марта 2011

У меня проблемы с пониманием концепции указателей, ниже приведен код. Почему своп (& a1, & a2) выводит -5, 6, а не 6, -5? Значения уже поменяются местами, верно?

void swap(int *ptr1, int *ptr2){

     int temp;

      temp = *ptr1;
      *ptr1 = *ptr2;
      *ptr2 = temp;

}

int main (int argc, char *argv[]){

    void swap(int *ptr1, int *ptr2);
    int a1 = -5;
    int a2 = 6;
    int *p1 = &a1;
    int *p2 = &a2;

    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: -5, 6

    swap(p1,p2);
    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: 6, -5

    swap(&a1, &a2);
    NSLog(@" a1 = %i, a2 =%i", a1, a2); // out puts: -5, 6
}

Ответы [ 3 ]

7 голосов
/ 08 марта 2011

Ваш первый вызов swap () поменял местами два значения, а второй вызов поменял их местами.

0 голосов
/ 08 марта 2011

Очень простой пример, чтобы получить представление об указателях ...

int i = 2; // i == 2
int *p = &i; // p == 0x00AB (say memory addres of i is 171)
int *q = p;  // q == 0x00AB q and p have the same value

p == q истинно

* p == 2 верно

* p == * q истинно

p = NULL;      // initializes the pointer, which is a good practice
if (*p == 2) { // don't do this as it can cause error or unpredictable results

i == 2 по-прежнему верно независимо от того, что вы сделали с вашей переменной-указателем

Переменные-указатели могут рассматриваться или считаться удерживающими«специальные» целочисленные значения, они хранят адрес памяти, который обычно является 32-разрядным числом (если вы не работаете на компьютере с 64-разрядным адресом).

0 голосов
/ 08 марта 2011

Вы меняете одну и ту же вещь каждый раз (Сорта), поэтому сначала вы меняете их, а затем вы меняете их обратно.a1 хранит значение -5 по адресу address1 (адрес - это место в памяти) a2 сохраняет значение 6 по адресу addess2 p1 указывает на адрес1 p2 указывает на адрес2, меняя местами p1 и p2со значением элемента по адресу address2.поэтому теперь address1 содержит значение 6, а address2 содержит значение -5. Здесь p1 и p2 по-прежнему указывают на одни и те же адреса, а a1 и a2 по-прежнему возвращают значения с тех же адресов, но значения были заменены.swapping & a1 и & a2 Swapping & a1 и & a2 делает то же самое, the & возвращает адреса в виде указателей, которые вы передаете их функции swap.Swap использует указатели и меняет значения адресов, на которые они указывают.

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

...