View Full Version : [C] Puntatore a puntatore con lista
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);
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:
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.
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.