Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

iph

chaine de caractères en C

Messages recommandés

Salut tlm,

 

il y a quelques trucs que je ne piges pas et vu que je n'ai pas trouver les réponses à mes questions j'me tourne vers vous :P

 

Pourquoi est ce que l'on a la valeur ascii et pas Coucou ?

Pourquoi est ce que le fait de mettre des tab[] fait planter. normalement *tab équivaut à tab[]...

Pourquoi est ce que je suis obligé de passer par "(*tab)[taille]" pour parcourir mon tableau, au lieu de *tab[taille] ?

 

d'avance merci

 

++ iph

 

#include <stdio.h>

int l(char **tab) {
int taille = 0;
while((*tab)[taille] != '\0') {
	taille++;
}
printf("tab		  : %p\n", tab);	   // @ de tableau_de_char
printf("&tab		 : %p\n", &tab);	  // @ du pointeur tab
printf("&(*tab)	  : %p\n", &(*tab));   // @ de tableau_de_char
printf("*tab		 : %s\n", *tab);	  // Coucou
//	printf("tab[]		: %s\n", tab[]);	 // ERREUR
//	printf("(*tab)[]	 : %s\n", (*tab)[]);  // ERREUR
printf("(*tab)[0]	: %d\n", (*tab)[0]); //valeur ascii 
printf("taille **tab : %d\n", sizeof(**tab)); // taille d'un char
printf("taille tab   : %d\n", sizeof(tab));   // taille d'un pointeur
printf("**tab		: %d\n", **tab);		 //valeur ascii
printf("&(**tab)	 : %p\n", &(**tab));
return taille;
}

int main (void) {

char *tableau_de_char = "Coucou";
int taille = 0;
printf("&(*tab_...)  : %p\n",  &(*tableau_de_char));
printf("*tab_...	 : %d\n\n",  *tableau_de_char);  // val ascii du premier char
taille = l(&tableau_de_char);
printf("emplacement de tableau_de_char : %p\n", &tableau_de_char);
printf("taille : %d\n", taille);
printf("taille : %d\n", sizeof(tableau_de_char)); // taille d'un pointeur (4 octets)
printf("taille d'un char : %d \n", sizeof(char)); //taille d'un type char (1 octet)
return 0;
}

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens de compiler et exécuter ton programme.

Voici le résultat :

&(*tab_...)  : 0x804870b
*tab_...	 : 67

tab		  : 0xbffff644
&tab		 : 0xbffff630
&(*tab)	  : 0xbffff644
*tab		 : Coucou
(*tab)[0]	: 67
taille **tab : 1
taille tab   : 4
**tab		: 67
&(**tab)	 : 0x804870b
emplacement de tableau_de_char : 0xbffff644
taille : 6
taille : 4
taille d'un char : 1 

Réponse à la question 1 :

- Tu as la valeur ascii et pas "Coucou" tout simplement parce que tu lui demandes d'afficher "%d" (donc un decimal) en lui passant en paramètre le premier caractère de ta chaîne...

 

Réponse à la question 2 :

- Ne confonds pas le C++ et le C. En C++ on peut effectivement substituer tab[] à *tab mais en C *tab correspond à tab[0] ! (C'est pour cette raison que le compilateur te colle une erreur à la ligne 12 lorsque tu vires le commentaire qui, soit dit en passant, n'est pas légal vis-à-vis des règles de programmation en C). Pour compiler du "vrai" C, perso j'utilise la commande "gcc -O2 -Wall -ansi -pedantic" comme ça je n'ai vraiment aucune raison de soupçonner la syntaxe de mon source et je peux me concentrer sur d'autres erreurs de programmation...

 

Réponse à la question 3 :

- Pour de sombres raisons de priorités d'opérateurs. Relis le K&R et tu auras les réponses. Il vaut mieux, pour des raisons de lisibilité et de maintenabilité, mettre les parenthèses de toute façon...

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

  • En ligne récemment   0 membre est en ligne

    Aucun utilisateur enregistré regarde cette page.

×