Question sur les pointeurs

Bonjour,
je suis en train de reprendre un vieil exercice de programmation, et j'ai un problème avec les pointeurs utilisés dans le code suivant:
int main(int argc, char* argv[])
{
	int n1,n2,result;
	char oper;

	if (argc!=4)
	{
		printf("erreur!!\n");
		exit(0);
	}

	n1=atoi(argv[1]);
	n2=atoi(argv[3]);
	oper=*(argv[2]);

	switch(op)
	{
		case'+':
			result=n1+n2;
			break;
		case'-':
			result=n1-n2;
			break;
		case'x':
			result=n1*n2;
			break;
		case'/':
			result=n1/n2;
			break;
	}
	
	printf("the result is %d\n",result);
}


pourquoi est ce que oper est un char et pas un char * et après on dit oper=*(argv[2]) (on a alors un pointeur non ?) ?

merci !

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. Simplement parce que tu as déclaré oper comme un char et non un char*.
    Remplace la ligne : char oper;
    Par : char* oper;
    Voilà !
    1. Contributeur
      Simplement parce que tu as déclaré oper comme un char et non un char*.
      Non, argv[2] renvoie un char* donc *(argv[2]) renvoie bien un char ;-).
    2. @fiddyC'est vrai, au temps pour moi, désolé !
    3. @fiddyEffectivement, je comprends pourquoi maintenant (je m'embrouillais avec des pointeurs de pointeurs)
      Merci !
  2. Contributeur
    Salut,

    pourquoi est ce que oper est un char et pas un char * et après on dit oper=*(argv[2]) (on a alors un pointeur non ?) ?
    argv est défini en tant que char *argv[];
    argv[0] va désigner le premier argument, ..., argv[2] va désigner le 3 ème argument.
    Ensuite tu fais *(argv[2]) (en fait, c'est l'équivalent de argv[2][0]), ce qui va prendre le premier caractère du troisième argument, soit un char.

    Cdlt
    1. sa ne devré pas étre un & pour transformer un char* en char?
      &(char*) = char ?
      1. Non mais là, argv[2] est déjà un pointeur donc &argv[2] correspond à l'adresse du pointeur ce qui ne va pas.
    2. Petit détail, c'est switch(oper) et non switch(op), non ?
      1. Contributeur
        Sûrement vu qu'op n'est pas défini.
        De plus, il serait mieux de mettre exit(1) ou return 1, que exit(0) dans le cas d'une erreur et de mettre return 0; avant l'accolade finale.
        Il faudrait aussi s'assurer que n2 est différent de 0 dans le cas de la division.
        Et il vaut mieux utiliser strtol qu'atoi pour gérer la détection d'erreurs.

        Cdlt
    3. Non mais là, argv[2] est déjà un pointeur donc &argv[2] correspond à l'adresse du pointeur ce qui ne va pas.
      oui tu a raison