Lorsqu'il s'agit de pointeurs, les personnes qui s'y perdent sont généralement dans l'un des deux camps. J'ai été (suis ?) dans les deux.
Le site array[]
foule
Ce sont les personnes qui ne savent pas comment passer de la notation par pointeur à la notation par tableau (ou qui ne savent même pas qu'elles sont liées). Voici quatre façons d'accéder aux éléments d'un tableau :
- notation de tableau (indexation) avec le nom du tableau
- notation de tableau (indexation) avec le nom du pointeur
- la notation du pointeur (le *) avec le nom du pointeur
-
la notation du pointeur (le *) avec le nom du tableau
int vals[5] = {10, 20, 30, 40, 50};
int *ptr;
ptr = vals;
array element pointer
notation number vals notation
vals[0] 0 10 (ptr + 0)
ptr[0] (vals + 0)
vals[1] 1 20 (ptr + 1)
ptr[1] (vals + 1)
vals[2] 2 30 (ptr + 2)
ptr[2] (vals + 2)
vals[3] 3 40 (ptr + 3)
ptr[3] (vals + 3)
vals[4] 4 50 (ptr + 4)
ptr[4] (vals + 4)
L'idée ici est que l'accès aux tableaux via des pointeurs semble assez simple et direct, mais une tonne de choses très compliquées et intelligentes peuvent être faites de cette façon. Certaines d'entre elles peuvent laisser les programmeurs C/C++ expérimentés perplexes, sans parler des débutants inexpérimentés.
Le site reference to a pointer
y pointer to a pointer
foule
Este est un excellent article qui explique la différence et que je citerai et dont je volerai du code :)
À titre de petit exemple, il peut être très difficile de voir exactement ce que l'auteur voulait faire si vous tombez sur quelque chose comme ceci :
//function prototype
void func(int*& rpInt); // I mean, seriously, int*& ??
int main()
{
int nvar=2;
int* pvar=&nvar;
func(pvar);
....
return 0;
}
Ou, dans une moindre mesure, quelque chose comme ça :
//function prototype
void func(int** ppInt);
int main()
{
int nvar=2;
int* pvar=&nvar;
func(&pvar);
....
return 0;
}
Au bout du compte, que résolvons-nous vraiment avec tout ce charabia ? Rien.
Maintenant, nous avons vu la syntaxe de ptr-to-ptr et ref-to-ptr. Existe-t-il avantages de l'une par rapport à l'autre ? Je crains que non. L'utilisation de l'un des deux, pour certains programmeurs sont juste préférences personnelles. Certains qui utilisent ref-to-ptr disent que la syntaxe est plus "propre". tandis que d'autres qui utilisent ptr-to-ptr, disent que que la syntaxe ptr-to-ptr rend plus clair pour pour ceux qui lisent ce que vous faites.
Cette complexité et la apparemment L'interchangeabilité (apparente en gras) avec les références, qui est souvent un autre inconvénient des pointeurs et une erreur des nouveaux arrivants, rend la compréhension des pointeurs difficile. Il est également important de comprendre, par souci d'achèvement, que les pointeurs vers les références sont illégaux en C et C++ pour des raisons confuses qui vous amènent à lvalue
- rvalue
sémantique.
Comme l'a fait remarquer une réponse précédente, il arrive souvent que des programmeurs de haut niveau pensent qu'ils sont intelligents en utilisant le système ******awesome_var->lol_im_so_clever()
et la plupart d'entre nous sont probablement coupables d'écrire de telles atrocités à certains moments, mais ce n'est tout simplement pas du bon code, et il n'est certainement pas maintenable.
Eh bien, cette réponse s'est avérée plus longue que je ne l'avais espéré...
55 votes
Réponse hargneuse, exagérée, inutilement controversée, avec une part de vérité : Ils ont été handicapés - mentalement mutilés, je vous le dis - en apprenant d'abord un de ces langages de haut niveau "expressifs". Ils auraient dû commencer par programmer sur du métal nu comme Dieu et Daniel Boone l'avaient prévu !
3 votes
...et Programmer serait mieux parce qu'il sera se transformer en une discussion malgré tous vos efforts.
0 votes
C'est argumentatif et subjectif, cela génère des résultats N, mon difficile est votre facile. Cela fonctionnera probablement sur les programmeurs, mais nous n'y migrons pas encore ces questions car le site n'est pas sorti de la phase bêta.
0 votes
Pour reprendre les mots de Christian Bale : "oohhhhhhh gooooooood for youuuuuu !". Certaines personnes peuvent et d'autres non. C'est aussi simple que cela.
2 votes
@Sam Saffron : Bien que je sois généralement d'accord pour dire que c'est plutôt une question de type programmers.SE, honnêtement, ce ne serait pas mal si les gens étaient prêts à marquer "Je pense que c'est facile" et "Je déteste voir des pointeurs" comme le spam qu'ils sont.
3 votes
Il faut que quelqu'un en parle : "C'est comme un doigt qui pointe vers la lune. Ne vous concentrez pas sur le doigt ou vous manquerez toute cette gloire céleste" --Bruce Lee
0 votes
Je ne les comprends jamais, car tous les livres sur le C++ et le C ne sont qu'une redite d'une redite d'une redite, tout comme la réponse acceptée est une redite d'une redite d'une redite. Rien de tout cela ne nous dit pourquoi le choix est fait d'utiliser des pointeurs et des adresses plutôt que de simplement utiliser des valeurs. Il n'y a aucune connaissance formative dans aucune des réponses ci-dessous ; alors, comment un nouveau programmeur peut-il apprendre à prendre des décisions de manière indépendante ? Cela met en évidence un défaut fondamental des styles d'enseignement dans l'ensemble du secteur, éclipsé par un mépris contagieux et atypique pour les enseignants compétents et les apprenants tactiles. Pas étonnant que le SIC soit au point mort.