Рекурсивные указатели - PullRequest
4 голосов
/ 20 января 2012

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

Затем он придумал:

#include <stdio.h>

int main()
{
    int v = 0;
    void* vp = &v;
    int i = 0;
    for(; i < 10; ++i)
    {
        printf("vp: %p, &vp: %p\n", vp, &vp);
        vp = &vp;
    }
}

Вывод этого:

vp: 0xbfd29bf8, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4
vp: 0xbfd29bf4, &vp: 0xbfd29bf4

Что для него не имеет смысла, как и для vp! = & Vp. Мне стыдно говорить, что я не знаю, что здесь происходит ... так, что здесь происходит?

Ответы [ 3 ]

7 голосов
/ 20 января 2012

Когда у вас есть эта строка в коде

    vp = &vp;

, неудивительно, что vp == &vp ...

На первой итерации, это то, что вы (и он) ожидаете.

1 голос
/ 20 января 2012

Что для него не имеет смысла, как и для vp! = & Vp.

Почему бы не сделать это после того, как вы выполнили это задание?

Если это поможет, попробуйте представить каждую переменную как занимающую номер в памяти, а указатель - как одну из этих пронумерованных областей памяти. Почему указатель void не может хранить значение, которое определяет его собственное местоположение?

1 голос
/ 20 января 2012

После выполнения этого кода:

vp = &vp;

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

vp: 0xbfd29bf8, &vp: 0xbfd29bf4

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

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