- Qual è la differenza tra quelli che utilizzano array [0] e * array?
- Perché dovrebbe essere preferibile?
- Differiscono in C++?
(1) Nessuna differenza in C. Nessuna differenza per un array raw reale in C++.
(2) Nessun motivo tecnico per preferire l'uno o l'altro, ma i neofiti potrebbero essere confusi dal dereferenziamento del puntatore.
(3) In C++ normalmente non si utilizza la macro, perché è molto pericolosa. Se passi un puntatore invece di un vero array raw, il codice verrà compilato ma restituirà un risultato errato. Quindi in C++ dovresti/dovresti usare un modello di funzione, come & hellip;
#include <stddef.h>
typedef ptrdiff_t Size;
template< class Type, Size n >
Size countOf(Type (&)[n]) { return n; }
Questo accetta solo l'array raw effettivo come argomento.
Fa parte di una triade di funzioni startOf
, endOf
e countOf
che è molto comodo per definire in modo che possano essere applicati ad entrambe le matrici prime e contenitori della libreria standard. Per quanto ne so, questa triade fu identificata per la prima volta da Dietmar Kuehl. In C++ 0x startOf
e endOf
saranno probabilmente disponibili come std::begin
e std::end
.
Cheers & hth.,
fonte
2010-12-11 06:36:04
Questo è incredibilmente criptico solo per evitare di essere usato in modo errato in C++, considerando che qualcos'altro dovrebbe essere usato in C++ comunque. –
Hai ragione che non dovrebbe essere usato in C++, ma il bit che fornisce un po 'di sicurezza specifica per C++ non è davvero troppo criptico (è solo l'indicizzazione insolita). La parte veramente criptica protegge da alcuni tipi di uso improprio in C che in realtà è piuttosto difficile da evitare (e la macro non protegge nemmeno perfettamente da questo abuso). L'uso improprio di cui si occupa (passando un puntatore invece di un argomento dell'array) si verifica abbastanza spesso che si paga per avere la complessità. Avvolto in una macro, la complessità non è un problema (e questa macro è meno criptica di molti che ho incontrato). –
Che tipo di diavolo è '0 [x]'? Ce la puoi fare? –