9
votes

Quelle est la différence entre le type * Nom et Tape * Nom []?

Quelle est la différence entre type ** Nom et tapez * Nom []?

Pourquoi quelqu'un utiliserait-il l'un sur l'autre?

merci

c c++

1 commentaires

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.


4 Réponses :


13
votes

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 };


6 commentaires

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 [] 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; mais si vous avez essayé cela avec Type ** Nom , vous seriez SEGFault, sauf que vous ne le rendiez manuellement sur un type valide * .


@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!



0
votes

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 [].

et l'autre, tapez * est un pointeur à un type ou dans ce cas, un type de tableau []. Donc, ils sont «presque» les mêmes.


1 commentaires

S'il vous plaît ne pensez pas à cela comme (type *) * ! La grammaire ne fonctionne pas de cette façon. Pensez-y comme type * (*) ou plutôt type (* (* nom)) : l'expression (* (* nom)) > est de type type . (Mais cela ne fonctionne pas pour les références, ni les fonctions.)



1
votes

dépend du contexte.

S'il définit une variable qui n'est pas un paramètre de fonction, alors Dans type ** Nom , Nom est un pointeur sur un pointeur sur une variable de type Type et dans Type * Nom [Certain_positive_integer_conset ] , c'est un éventail de pointeurs à variables de type type .

Si c'est un paramètre de fonction, les deux sont identiques, et nom est un pointeur sur un pointeur sur une variable de type type . .


3 commentaires

Dans une variable déclaration qui est pas une définition, vous pouvez omettre quelque_positive_integer_conset


@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 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 est également une définition .



4
votes

La différence entre les deux est principalement démontrée lors de la déclaration / définissant des objets de type.

La notation Type * Nom [] crée une matrice de taille inconnue (peut être déduite de l'initialisateur ), type ** Nom crée un pointeur. Cela signifie: xxx

Ils se comportent différemment dans certaines expressions. En particulier, les tableaux ne peuvent pas être attribués, mais les variables de pointeur peuvent: xxx

la taille de l'opérateur de taille fonctionne différemment sur les deux. Tailleof (tableau) dépendra du nombre d'éléments du tableau (peut être 12 dans ce cas), mais Tailleof (PTR) retourne toujours la même taille (par exemple. 4 sur les architectures principales 32 bits)

En outre, lors de la déclaration de variables globales, vous ne devez pas mélanger les deux: xxx

doit être accompagné dans le .C fichier par xxx

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.

Cependant, lors de la déclaration ou de la transmission de paramètres aux fonctions, elles sont identiques. Donc xxx


1 commentaires

" Les tableaux ne sont pas des lvalues ​​" Ils sont Lvalues. " Donc, ils ne peuvent pas être assignés à " et il ne suivrait de toute façon pas: (x n'est pas un lvalue) fait pas implique ("x = autre;" est malade -formé). C ++ n'est pas une langue simple. ;)