Newsgroup: it.comp.lang.c++
Titolo: Operatori &, * e []

Salve,
ho delle piccole domande-lampo sul C++... :)
Qual č, secondo lo standard, la differenza tra & e * nell'intestazione
di una funzione?
Ho letto (su questo ng) che probabilmente il compilatore usi
esclusivamente il *, anche dove ci sia &.
Perché esiste il puntatore a NULL (a zero, void) ma non si puň
restituire un riferimento a NULL? Ho una funzione:
T* foo (T a, T v[])
{
	if (a != 0)
		return &v[a];		// non ho testato -_-
	return NULL;
}
Se cambio il valore restituito dalla funzione da T* a T&, come modifico
l'ultimo return?
Cosa fa l'operatore [] ? Ha sempre lo stesso comportamento di default
(sempre che l'utente non redifinisca nulla)?
Cioč:
v[a] ==> *(v + ( a * sifeof(a) ) ) // (spero di non aver sbagliato)
Vale sempre questa "implicazione"? Con ogni tipo?
Ho visto che spesso viene usato nei tornei di offuscamento (ohccc per
esempio) in modo perverso... e cosě m'č diventato simpatico. :)
Vado sul sito di ohccc per vedere se ci sono spiegazioni...
Grazie in anticipo,
Steink

 Vale sempre questa "implicazione"? Con ogni tipo?
v[i] e` equivalente a (*(v+i)), se l'indice e' un intero e l'altro e` un 
puntatore o un array, visto che l'aritmetica dei puntatori tiene sempre 
conto della dimensione del tipo dell'oggetto puntato dal puntatore. E 
anche nel tuo esempio (sbagliato), casomai sarebbe "sizeof(v)" (ripeto, 
sbagliato, vedi qualche thread piu` in su).
+++
Cmq, se vuoi un consiglio, prima di dedicarti agli offuscamenti, vedi di 
riuscire a evitare di scrivere codice offuscato per sbaglio, altrimenti 
e` come mettere il carro davanti ai buoi (hint: non va avanti) :-)
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

 Zucchero sintattico, se vuoi.
Un linguaggio di programmazione ad alto livello è sempre zucchero
sintattico rispetto all'ASM ma questo non lo rende meno utile, no?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 sintattico rispetto all'ASM ma questo non lo rende meno utile, no?
Assolutamente d'accordo, mai detto il contrario :-)


 dichiarare come <tipo> *, ma solo come <tipo> nome[].
Grazie dei links. Ok, ho capito comunque che si parla addirittura di
compilatori C pre-K&R! Insomma, non mi pare proprio corretta la tua
affermazione che la notazione
T1 Foo( T2 var[] );
sia un residuo del passato. O da qualche parte lo standard considera
deprecata tale notazione?


 deprecata tale notazione?
No, e` perfettametne standard.
Cio` non toglie che di per se` che sia un retaggio, visto che gli array 
sono sempre passati per riferimento come puntatori al primo elemento, in 
C++ come in C, e che la cosa confonde chi non conosce questo piccolo 
pezzetto di informazione (mentre a chi la conosce fornisce una buona 
dritta).


 dritta).
Però in molti casi è indispensabile. Come dichiareresti, altrimenti una
funzione come questa
void Pippo( int (*a)[ 500 ] );


 Vale sempre questa "implicazione"? Con ogni tipo?
Non e' esatto. Dati
int i = 2;
double v[10];
v[i] == *( v + i );
Dove la somma tra un puntatore e un intero vale effettivamente come se
fosse scritto:
* ( v + ( i * sizeof(double) ) )
Dal momento che la somma e' commutativa si ha il curioso effetto che 
v[i] == i[v]
Ciao,
Nicola

 void Pippo( int (*a)[ 500 ] );
Concordo che se vuoi esprimere anche la numerosita` non hai alternative.
Chiaramente si puo` evitare l'uso diretto nelle signature dei 
metodi/funzioni. Basta il solito  typedef:
     typedef int DataArray[500];
     void Pippo(DataArray a);


      void Pippo(DataArray a);
Con il quale, perň, nascondi solo il fatto che DataArray č un array (il
nome, secondo me, potrebbe non essere sufficiente a ricordarlo) oppure
addirittura un puntatore (quando degenera) e la cosa potrebbe non essere
sempre positiva (tutt'altro). Ecco, io questo sě lo considero "zucchero
sintattico" nel senso negativo del termine.
