J'ai un programme C:
#include <stdio.h>
int main(){
int b = 10; //assign the integer 10 to variable 'b'
int *a; //declare a pointer to an integer 'a'
a=(int *)&b; //Get the memory location of variable 'b' cast it
//to an int pointer and assign it to pointer 'a'
int *c; //declare a pointer to an integer 'c'
c=(int *)&a; //Get the memory location of variable 'a' which is
//a pointer to 'b'. Cast that to an int pointer
//and assign it to pointer 'c'.
printf("%d",(**c)); //ERROR HAPPENS HERE.
return 0;
}
Le compilateur génère une erreur:
error: invalid type argument of ‘unary *’ (have ‘int’)
Quelqu'un peut-il expliquer ce que signifie cette erreur?
Étant donné que c
contient l'adresse d'un pointeur entier, son type doit être int**
:
int **c;
c = &a;
L'ensemble du programme devient:
#include <stdio.h>
int main(){
int b=10;
int *a;
a=&b;
int **c;
c=&a;
printf("%d",(**c)); //successfully prints 10
return 0;
}
programme Barebones C pour produire l'erreur ci-dessus:
#include <iostream>
using namespace std;
int main(){
char *p;
*p = 'c';
cout << *p[0];
//error: invalid type argument of `unary *'
//peeking too deeply into p, that's a paddlin.
cout << **p;
//error: invalid type argument of `unary *'
//peeking too deeply into p, you better believe that's a paddlin.
}
ELI5:
Le maître met une pierre ronde brillante dans une petite boîte et la donne à un élève. Le maître dit: "Ouvrez la boîte et retirez la pierre". L'élève le fait.
Ensuite, le maître dit: "Maintenant, ouvrez la pierre et retirez la pierre". L'élève a dit: "Je ne peux pas ouvrir une pierre".
L'élève a ensuite été éclairé.
J'ai reformaté votre code.
L'erreur se situait dans cette ligne:
printf("%d", (**c));
Pour y remédier, passez à:
printf("%d", (*c));
Le * récupère la valeur d'une adresse. Le ** récupère la valeur (une adresse dans ce cas) d'une autre valeur à partir d'une adresse.
De plus, le () était facultatif.
#include <stdio.h>
int main(void)
{
int b = 10;
int *a = NULL;
int *c = NULL;
a = &b;
c = &a;
printf("%d", *c);
return 0;
}
MODIFIER:
La ligne :
c = &a;
doit être remplacé par:
c = a;
Cela signifie que la valeur du pointeur "c" est égale à la valeur du pointeur "a". Ainsi, "c" et "a" pointent vers la même adresse ("b"). La sortie est:
10
MODIFIER 2:
Si vous souhaitez utiliser un double *:
#include <stdio.h>
int main(void)
{
int b = 10;
int *a = NULL;
int **c = NULL;
a = &b;
c = &a;
printf("%d", **c);
return 0;
}
Sortie:
10
Une fois que vous avez déclaré le type d'une variable, vous n'avez pas besoin de le convertir en ce même type. Vous pouvez donc écrire a=&b;
. Enfin, vous avez incorrectement déclaré c
. Puisque vous l'affectez comme étant l'adresse de a
, où a
est un pointeur vers int
, vous devez le déclarer comme un pointeur vers un pointeur vers int
.
#include <stdio.h>
int main(void)
{
int b=10;
int *a=&b;
int **c=&a;
printf("%d", **c);
return 0;
}