Quelle est la différence entre type ** Nom et tapez * Nom []? P>
Pourquoi quelqu'un utiliserait-il l'un sur l'autre? P>
merci p>
4 Réponses :
Eh bien, cela dépend, est-ce dans une déclaration variable ou dans un argument de la fonction? Si dans une déclaration de variable:
Type** name = &pointer_to_type;
Type* name[] = { &pointer_to_type, 0, &pointer_to_type };
J'ai peur de toi, petit cheval. Membre de 32 jours et 6000 de la réputation. Quelle est la technique?
J'aime ajouter un peu sur l'allocation de mémoire, aussi: Utilisation de Type * Nom [] code> Comme une déclaration de variable vous permet automatiquement une mémoire valide à la première Déroférence (tableau des pointeurs est disposé sur la pile). Vous pouvez utiliser ces commandes dans la séquence: type * Nom [4]; Nom [3] = null; code> mais si vous avez essayé cela avec Type ** Nom code>, vous seriez SEGFault, sauf que vous ne le rendiez manuellement sur un type valide * code >.
@sidyll: enthousiasme je suppose que je suppose? J'ai même un badge pour ça: p
Eh bien, et j'ai un badge fanatique :-) Quoi qu'il en soit, félicitations pour vos efforts et vos talents pour répondre à la précision.
K-ballo: vous ne donnez pas de primes ??
@Sidyll, merci pour un rire ... Je ne pouvais aussi m'empêcher de remarquer que le petit cheval est en feu. @K, voici un autre badge pour vous!
Fondamentalement, tapez ** est un pointeur au pointeur. Pense que ça aime (tapez *) *. Donc, il pointe de taper * qui peut être un type ou un type []. P>
et l'autre, tapez * est un pointeur à un type ou dans ce cas, un type de tableau []. Donc, ils sont «presque» les mêmes. P>
S'il vous plaît ne pensez pas à cela comme (type *) * code>! La grammaire ne fonctionne pas de cette façon. Pensez-y comme type * (*) code> ou plutôt type (* (* nom)) code>: l'expression (* (* nom)) > est de type type code>. (Mais cela ne fonctionne pas pour les références, ni les fonctions.)
dépend du contexte. P>
S'il définit une variable qui n'est pas un paramètre de fonction, alors
Dans Si c'est un paramètre de fonction, les deux sont identiques, et code> nom code> est un pointeur sur un pointeur sur une variable de type type ** Nom code>, Nom code> est un pointeur sur un pointeur sur une variable de type Type code> et dans Type * Nom [Certain_positive_integer_conset ] code>, c'est un éventail de pointeurs à variables de type type code>. p>
type p>. P>.
Dans une variable déclaration b> qui est pas b> une définition, vous pouvez omettre quelque_positive_integer_conset code>
@CuciousGuy: au champ d'application "INT * GA [];" Résultats dans "Avertissement: tableau GA" supposé avoir un élément ". Dans la portée de la fonction "int * ma [];" Résultats dans "Erreur: taille du tableau manquant dans code> ma '". Vous voulez éviter de telles situations. "extern int * ega [];" est ok, cependant. Ceci est avec GCC (3.3.4), compilé en C avec tous les avertissements activés.
Il n'y a pas de "périmètre de fichier". Vous signiez probablement une portée globale. Dans toute portée, une déclaration variable sans le qualificatif de classe de stockage externe code> est également une définition b>.
La différence entre les deux est principalement démontrée lors de la déclaration / définissant des objets de type.
La notation Ils se comportent différemment dans certaines expressions. En particulier, les tableaux ne peuvent pas être attribués, mais les variables de pointeur peuvent: p> la taille de l'opérateur de taille fonctionne différemment sur les deux. En outre, lors de la déclaration de variables globales, vous ne devez pas mélanger les deux: p> doit être accompagné dans le et vice versa. Fondamentalement, la définition du moyen de réalisation de plusieurs objets consécutifs, alors que la définition d'un point de pointeur constitue une variable unique. Le compilateur traite à la fois différemment et savoir ce qui est lequel. P> Cependant, lors de la déclaration ou de la transmission de paramètres aux fonctions, elles sont identiques. Donc p> Type * Nom [] code> crée une matrice de taille inconnue (peut être déduite de l'initialisateur ), type ** Nom code> crée un pointeur. Cela signifie: p> Tailleof (tableau) CODE> dépendra du nombre d'éléments du tableau (peut être 12 dans ce cas), mais Tailleof (PTR) code> retourne toujours la même taille (par exemple. 4 sur les architectures principales 32 bits) p> .C code> fichier par p>
" Les tableaux ne sont pas des lvalues i>" Ils sont b> Lvalues. " Donc, ils ne peuvent pas être assignés à i>" et il ne suivrait de toute façon pas: (x n'est pas un lvalue) fait pas b> implique ("x = autre;" est malade -formé). C ++ n'est pas une langue simple. ;)
Il n'y a pas de différence, efficacement. Par exemple, nous voyons toujours CHAR ** ARGV et CHAR * ARGV [] utilisé de manière interchangeable pour déclarer des arguments à la principale dans un programme C. Vous pouvez choisir l'un sur l'autre pour des raisons de clarté ou de cohérence.