Domanda esame in c++
Ragazzi scusate, ho un problema su questi 3 vero/falso
Date le seguenti dichiarazioni in linguaggio C:
typedef TipoDato *TipoPuntatore;
typedef AltroTipoDato *AltroTipoPuntatore;
TipoDato *Puntatore;
TipoDato **DoppioPuntatore;
TipoPuntatore P,Q;
AltroTipoPuntatore P1,Q1;
TipoDato x,y;
AltroTipoDato z,w;
Stabilire la veridicità delle seguenti affermazioni.
a) L'assegnazione *P=*Q è corretta.
b) L'assegnazione *DoppioPuntatore = y è corretta.
c) L'assegnazione z=*P1 è corretta.
La a) mi sembra VERA, credo sia possibile effettuare l'assegnamento, per la b e la c non riesco proprio a trovare
alcun tipo di spiegazione.
Grazie a tutti,in anticipo,per l'aiuto.
Date le seguenti dichiarazioni in linguaggio C:
typedef TipoDato *TipoPuntatore;
typedef AltroTipoDato *AltroTipoPuntatore;
TipoDato *Puntatore;
TipoDato **DoppioPuntatore;
TipoPuntatore P,Q;
AltroTipoPuntatore P1,Q1;
TipoDato x,y;
AltroTipoDato z,w;
Stabilire la veridicità delle seguenti affermazioni.
a) L'assegnazione *P=*Q è corretta.
b) L'assegnazione *DoppioPuntatore = y è corretta.
c) L'assegnazione z=*P1 è corretta.
La a) mi sembra VERA, credo sia possibile effettuare l'assegnamento, per la b e la c non riesco proprio a trovare
alcun tipo di spiegazione.
Grazie a tutti,in anticipo,per l'aiuto.
Risposte
Innanzitutto tieni presente che
non significa questo
ma questo
P e Q sono di tipo TipoPuntatore, cioè puntatore a TipoDato. Quindi *P e *Q sono entrambi di tipo TipoDato, quindi l'assegnamento è valido.
Nota: se però TipoDato non è un tipo primitivo ma è una classe, l'assegnamento è valido solo se per tale classe è definito l'operatore di assegnamento.
DoppioPuntatore è di tipo TipoDato **, cioè puntatore a puntatore a TipoDato. Quindi *DoppioPuntatore è di tipo puntatore a TipoDato. y è di tipo TipoDato. Quindi l'assegnamento non è valido.
In generale non è mai valido assegnare un puntatore ad un non-puntatore o viceversa. Né assegnare un puntatore ad un altro di tipo diverso (salvo classi nella stessa gerarchia). Queste operazioni possono essere forzate usando reinterpret_cast<> (o i cast stile C), a rischio e pericolo del programmatore.
P1 è di tipo AltroTipoPuntatore, cioè puntatore a AltroTipoDato. Quindi *P1 è di tipo AltroTipoDato. Anche z è dello stesso tipo, quindi vale lo stesso ragionamento del punto 1.
typedef AltroTipoDato *AltroTipoPuntatore;
non significa questo
typedef AltroTipoDato * AltroTipoPuntatore;
ma questo
typedef AltroTipoDato * AltroTipoPuntatore;
*P = *Q
P e Q sono di tipo TipoPuntatore, cioè puntatore a TipoDato. Quindi *P e *Q sono entrambi di tipo TipoDato, quindi l'assegnamento è valido.
Nota: se però TipoDato non è un tipo primitivo ma è una classe, l'assegnamento è valido solo se per tale classe è definito l'operatore di assegnamento.
*DoppioPuntatore = y
DoppioPuntatore è di tipo TipoDato **, cioè puntatore a puntatore a TipoDato. Quindi *DoppioPuntatore è di tipo puntatore a TipoDato. y è di tipo TipoDato. Quindi l'assegnamento non è valido.
In generale non è mai valido assegnare un puntatore ad un non-puntatore o viceversa. Né assegnare un puntatore ad un altro di tipo diverso (salvo classi nella stessa gerarchia). Queste operazioni possono essere forzate usando reinterpret_cast<> (o i cast stile C), a rischio e pericolo del programmatore.
z = *P1
P1 è di tipo AltroTipoPuntatore, cioè puntatore a AltroTipoDato. Quindi *P1 è di tipo AltroTipoDato. Anche z è dello stesso tipo, quindi vale lo stesso ragionamento del punto 1.