42 votes

Déclarer le type de pointeurs?

Je viens de lire que nous devons donner le type de pointeurs tout en les déclarant en C (ou C ++) c'est-à-dire;

 int *point ;
 

Pour autant que je sache, les pointeurs stockent l'adresse des variables et l'adresse occupe la même quantité de mémoire, quel que soit le type. Alors, pourquoi devons-nous déclarer son type?

70voto

Mike Seymour Points 130519

Type de sécurité. Si vous ne savez pas ce qu' p est censé point, alors il n'y aurait rien pour empêcher la catégorie des erreurs de ce type

*p = "Nonsense";
int i = *p;

Vérifier le type statique est un outil très puissant pour la prévention de tous les types d'erreurs comme ça.

Le C et le C++ aussi le soutien de l'arithmétique des pointeurs, qui ne fonctionne que si la taille de la cible est de type connu.

adresse occupe la même quantité de mémoire quel que soit mon être le type de

C'est le cas aujourd'hui pour populaires de plates-formes. Mais il y a eu des plates-formes pour lesquelles ce n'était pas le cas. Par exemple, un pointeur vers un multi-byte word pourrait être plus petit qu'un pointeur sur un seul octet, puisqu'il n'a pas besoin de représenter l'octet du décalage à l'intérieur de la parole.

35voto

Kninnug Points 5451

Parce que:

  1. les adresses de différents types n'avez pas besoin d'avoir la même taille. La norme spécifie explicitement si (C 2011 standard en ligne (projet), 6.2.5/28).
  2. type de sécurité: cela permet au compilateur de détecter lorsque vous fournissez un incompatible pointeur à une fonction, ou d'une affectation. Ce à son tour empêche laid situations où vous gâcher l'argument de l'ordre à une fonction.
  3. le compilateur a besoin de connaître le type lorsque le pointeur est déréférencé.
  4. pour faire de l'arithmétique des pointeurs de la taille de l'objet pointé doit être connue et donc de son type.

Les deux derniers points ne s'appliquent pas à void des pointeurs, c'est pourquoi elles ne peuvent pas déréférencé et pas de l'arithmétique des pointeurs peut être fait sur eux. La norme spécifie que l' void pointeur doit être assez grande pour contenir tout type de pointeur (à l'exception des pointeurs de fonction, qui sont une autre histoire) et que la cession et de void des pointeurs peut être faite sans moulages (au moins en C, en C++, les castes sont toujours nécessaires).

13voto

Mihai Maruseac Points 10647

Une raison en est dans l'arithmétique des pointeurs. Vous ne pouvez pas faire p+1 , à moins que vous connaissez la taille de l'élément auquel p points -- qui est de la taille d'un type auquel p est un pointeur. Si vous essayez p+1 sur void *p vous êtes susceptible d'avoir une mauvaise réponse (c'est la même que si elle se fait sur un char * mais peut-être que vous ne voulez pas que; il est pris en -pedantic comme un avertissement et en -pedantic-errors comme une erreur).

Une autre raison est le type de sécurité. Si une fonction prend comme argument une int * vous ne pouvez pas passer un pointeur à l' char (une chaîne) il y a des. Vous obtenez un avertissement (une erreur avec -Werror / -pedantic-errors). Considérez ceci (dummy) code:

void test(int *x)
{
}

int main()
{
    char *x = "xyz";
    test(x);
    return 0;
}

La compilation (à l'aide d' gcc (GCC) 4.8.2 20131017 (Red Hat 4.8.2-1)) donne:

1.c: In function ‘main':
1.c:8:2: warning: passing argument 1 of ‘test' from incompatible pointer type [enabled by default]
  test(x);
  ^
1.c:1:6: note: expected ‘int *' but argument is of type ‘char *'
 void test(int *x)
      ^

11voto

Shafik Yaghmour Points 42198

Alors, pourquoi avons-nous besoin de déclarer son type?

Vous voulez connaître le type du pointeur de la souris de sorte que vous pouvez faire vérifier le type statique.

Nous avons également besoin de connaître le type pour l'arithmétique des pointeurs de travail, par exemple lorsque nous indice dans un tableau(ce qui est équivalent à l'arithmétique des pointeurs) de différents types de taille, le pointeur sera ajusté par un type dépendant de la quantité. Si l'on regarde le projet de standard C99 section 6.5.6 Additif opérateurs dit (c'est moi qui souligne):

De plus, les deux opérandes ont arithmétique de type, ou un opérande doit être une pointeur vers un objet de type [...]

De sorte que le pointeur doit être d'un type d'objet, ce qui signifie pas incomplète ou nulle.

Vous avez également dit:

adresse occupe la même quantité de mémoire, quel que soit le type. Alors, pourquoi avons-nous besoin de déclarer son type?

Ce n'est pas toujours vrai en C++ la taille des pointeurs vers les fonctions de membre peut changer selon le type de classe, de l'un des articles qui couvre ce qui est des Pointeurs vers les fonctions membres sont très étranges animaux.

De plus, nous pouvons voir que les deux C99 projet de norme section 6.2.5 Types paragraphe 27 qui dit:

[...] Les pointeurs vers d'autres types n'ont pas besoin d'avoir la même représentation ou l'alignement des exigences.

et le projet de norme C++ section 3.9.2 Composé types paragraphe 3 , dit:

[...] La représentation de la valeur de type pointeur est mise en œuvre définies. Des pointeurs vers des cv qualifiés et cv-non qualifié versions (3.9.3) de mise en page compatible avec les types ont la même valeur de la représentation et de l'alignement des exigences (3.11). [...]

ne nécessitent pas de pointeurs ont la même représentation , sauf dans des cas spécifiques.

8voto

Juzz Coding Points 266

Vous devez spécifier le type tel que demandé par la norme. De plus, il n'y a aucun problème lorsque vous essayez d'effectuer une arithmétique de pointeur comme une addition ou une soustraction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X