PDA

View Full Version : [C] Puntatore a puntatore con lista


sharkkk
12-02-2014, 13:51
Ciao a tutti,

mi trovavo in difficolta con questo esempio, che non mi stampa il valore 1 (p->value = 1) dandomi errore.

#include <stdlib.h>
#include <stdio.h>

typedef struct list{
int value;
} list;

int main(){

list* p = (list*) malloc (sizeof(list));
p->value = 1;

list** q;
q = &p;

printf("%d \n", q->value);

system("PAUSE");
}


come devo fare per accedere al campo p->value tramite q?

Daniels118
12-02-2014, 14:00
Con l'istruzione q = &p; stai referenziando il puntatore p, pertanto quando vuoi accedervi da q lo devi dereferenziare con l'operatore *:
printf("%d \n", (*q)->value);

sharkkk
12-02-2014, 14:11
Con l'istruzione q = &p; stai referenziando il puntatore p, pertanto quando vuoi accedervi da q lo devi dereferenziare con l'operatore *:
printf("%d \n", (*q)->value);

avevo provato a fare anche cosi ma mi da questo errore

16 request for member of non-aggregate type before ')' token
16`value' has not been declared

Daniels118
12-02-2014, 14:22
Appena provato, a me funziona :read:

sharkkk
12-02-2014, 14:24
Avevo sbagliato a scriverla :cry:

però perche cosi funziona:
printf("%d \n", (*q)->value);

e perche cosi non funziona? cosa cambia
printf("%d \n", *q->value);

p.s. ti ringrazio daniels

Daniels118
12-02-2014, 14:40
Perchè l'operatore di accesso ai membri di struttura -> ha priorità rispetto all'operatore di dereference *, pertanto il compilatore capisce che tu vuoi accedere al membro value di q e poi vuoi dereferenziarlo, ma q è un puntatore, non una struttura, pertanto non ha membri e viene generato quell'errore. Quello che invece bisogna fare è dereferenziare il puntatore per ottenere la struttura e poi accedere al membro. Le parentesi dicono al compilatore cosa fare prima, nel dubbio mettile sempre.

sharkkk
12-02-2014, 15:14
Perchè l'operatore di accesso ai membri di struttura -> ha priorità rispetto all'operatore di dereference *, pertanto il compilatore capisce che tu vuoi accedere al membro value di q e poi vuoi dereferenziarlo, ma q è un puntatore, non una struttura, pertanto non ha membri e viene generato quell'errore. Quello che invece bisogna fare è dereferenziare il puntatore per ottenere la struttura e poi accedere al membro. Le parentesi dicono al compilatore cosa fare prima, nel dubbio mettile sempre.

grazie mille daniel, impeccabile come sempre