Domanda esame in c++

Kekkonen
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.

Risposte
claudio862
Innanzitutto tieni presente che

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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.