J'ai un problème suivant pour comprendre la syntaxe C / C ++. Supposons que nous ayons les données suivantes:

int a[3] = {1,3,5};
int b[3] = {2,4,6};
int* p[2];

J'ai créé un tableau p contenant deux pointeurs.

Première question : pourquoi le travail suivant ne fonctionne-t-il pas:

p[0] = &a; p[1] = &b;

Puisque les pointeurs prennent les adresses comme valeurs. Pour une raison quelconque, p[0] = a; p[1] = b; fonctionne cependant.

Deuxième question: étant donné que p [0] pointe désormais sur a, pourquoi *(*(p[0]))[0] ne fonctionne-t-il pas? Comment dois-je obtenir la valeur d'un pointeur référençant un à un certain index?

Contexte: je rencontre ces problèmes parce que j'essaie d'étendre naturellement la syntaxe avec des scalaires aux tableaux, où la syntaxe suivante fonctionnerait:

  double a = 3;
  double* p = &a;

Et * p donne la valeur, tandis que p donne l'adresse.

1
Cebiş Mellim 4 avril 2020 à 19:35

3 réponses

Meilleure réponse

Première question: pourquoi la mission suivante ne fonctionne-t-elle pas:

p[0] = &a; p[1] = &b;

Si vous utilisez une seule variable int* à partir d'un tableau de pointeurs, à quoi vous attendriez-vous qu'elle pointe? Adresse d'un tableau dans son ensemble ou d'un élément particulier? Bien sûr, une valeur singulière, pour laquelle p[index] ne peut être affectée qu'à une seule variable, comme a[index] dans votre cas. Par exemple, cela fonctionnerait:

p[0] = &a[0];
// cout<<*p[0]; would yield a[0] or 1.

Deuxième question: puisque p [0] pointe maintenant vers a, pourquoi *(*(p[0]))[0] ne fonctionne-t-il pas? Comment dois-je obtenir la valeur d'un pointeur référençant un à un certain index?

Vous déréférencez le pointeur (vous auriez dû faire référence à &). Utilisez p[0][index] pour référencer a à l'index requis.

2
Anirban166 4 avril 2020 à 17:23

Il existe différents types de pointeurs. &a est un pointeur vers un tableau de 3 int s. p[0] est un pointeur vers un seul int. Ils ne sont pas compatibles. Pendant ce temps, un tableau peut se désintégrer en un pointeur vers le premier élément, donc p[0] = a fait pointer p[0] vers le premier élément de a. Vous pouvez accéder aux éléments dans a en appliquant un décalage au pointeur sur le premier élément à l'aide de *(p[0] + i) qui est équivalent à p[0][i].

3
BessieTheCow 4 avril 2020 à 16:57

Le tableau a, lorsqu'il est utilisé dans ce contexte, se comporte comme s'il était un pointeur vers son premier élément de tableau.

Donc, un nu se comporte comme un & [0]

Tandis que & a est l'adresse de la variable de tableau local. So & a est l'adresse d'un tableau.

1
bolov 4 avril 2020 à 18:17