LINUX.ORG.RU

[Неосилил-тред][C] Указатаель на указатель

 


0

1

Балуюсь C на академическом уровне.

Тупая задача:

есть указатель void *p;. Указатель указывает на ячейку памяти, в которой хранится ещё один адрес. Как его считать? Моя логика подсказывает, что p = *p; должно работать, но компилятор линейкой бьёт меня по рукам.

Как это грамотно реализовывается?

Надо привести p в типу указатель на указтель на void.

Вр.И.О.К.О.

Begemoth ★★★★★
()

Я что-то совсем затупил. Если можно, то давайте разберум на конретном примере.

Есть переменная mem. В ней хранится адрес на следуюущий указатель, по которому получим ещё один адрес и так далее. Суть: обойти достаточно длинную цепь указателей.

Как вы предлагаете, необходимо завести: void **p. Ммм... а дальше?

DarkAmateur ★★★★
() автор топика
Ответ на: комментарий от DarkAmateur

void **st;

*st = mem;

Засегфолтит. st не определён ещё, а ты его разыменовываешь. Можно делать такое:

char *p1 = new char;
*p1 = 'A';
char **p2 = &p1;
char ch = **p2; // ch == 'A'
gentoo_root ★★★★★
()
Ответ на: комментарий от uGin

Не так быстро:

static void *memBig;
...
void traceInt(void) {
    void *st;
    st = memBig;
    st = (void *) *st;
}
main.c:57: предупреждение: доступ по указателю ‘void *’
main.c:57: ошибка: неправильное использование void-выражения

... иначе топика не было бы.

DarkAmateur ★★★★
() автор топика

> есть указатель void *p;. Указатель указывает на ячейку памяти, в которой хранится ещё один адрес. Как его считать?

p = *(void**)p;

arsi ★★★★★
()
Ответ на: комментарий от DarkAmateur

Указатель p просто надо было сразу объявлять как 'тип **', а разыменовывать **p. А потом из-за этих приведений типов рождается жуткий быдлокод. Если указатель указывает на указатель на тип, то это и надо писать, а не нетипизированный указатель.

gentoo_root ★★★★★
()

... переменная ,представляющая собой указатель на указатель ,объявляется следующим образом : перед её именем ставится ещё одна звёздочка ..

#include <stdio.h>

double x=1200000;
double *p1;
double **PP1;


int main()
{
    p1=&x;
    PP1=&p1;

    printf ("%f",**PP1);
    return 0;
}
Gramozeka ★★
()

Первый идущий в голову быдлокод:

p= *( (void**)p );

cattail
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.