Char vs int / char* / FILE*/ help
Résolu/Fermé
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
-
22 nov. 2009 à 03:19
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 22 nov. 2009 à 21:23
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 22 nov. 2009 à 21:23
A voir également:
- Char vs int / char* / FILE*/ help
- Host file - Guide
- .Bin file - Guide
- .Dat file - Guide
- Udp vs tcp - Guide
- Swf file player - Télécharger - Lecture
6 réponses
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
22 nov. 2009 à 10:10
22 nov. 2009 à 10:10
- int chaine[]="bonjour" sa marche pas simplment car "bonjour" n'est pas un int
exemple les pionteur :
exemple structure
on la manipule de cette facon
exemple les pionteur :
#include <stdio.h> int* fonction(int* pt); int main(){ int nb = 5; int* pt = &nb // ici on dit que la variable pt qui est un pointeur recoit l'adreese memoire de nb fonction(pt) printf(nb); //sa affiche 7 } int* fonction(int* pt){ return pt+2; //ici on change pas la valeur du pt mais du nb car son adrrese se trouve dans pt }
exemple structure
struct client{ char nom[10]; char prenom[10]; int age; char sexe; };
on la manipule de cette facon
struct client unClient; printf("Entrez le nom de la personne %d : ",cpt); scanf("%s",unClient.nom); printf("Entrez le prenom de la personne %d : ",cpt); scanf("%s",unClient.prenom); printf("Entrez l' age de la personne %d : ",cpt); scanf("%d",&unClient.age); printf("Entrez le sexe de la personne %d : ",cpt);
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
22 nov. 2009 à 19:23
22 nov. 2009 à 19:23
1- un char n'est pas un int mais c'est un caractère "numérique ou alphabétique " ex char letre= 'a';
ou char nb1='1';
char nb2='2';
!!!!!! nb1+nb2 ne donne pas 2 mais sa donne "je croit" code ascii de '1' + celui de '2'
2- char* ou int* ou float* est un pointeur il contient l'adresse mémoire d'une variable j'ai déjà donne un exemple avant
!! c'est vraiment difficile de comprendre cette aspect de pointeur je te conseil de faire de exemple et les exécute
FILE* et un type qui contient l'adresse d'un fichier pour pouvoir le manipuler
3- une variable constante ne se sera jamais modifier :) c'est le but plus sa ne prend pas de place mémoire je croit
ou char nb1='1';
char nb2='2';
!!!!!! nb1+nb2 ne donne pas 2 mais sa donne "je croit" code ascii de '1' + celui de '2'
2- char* ou int* ou float* est un pointeur il contient l'adresse mémoire d'une variable j'ai déjà donne un exemple avant
!! c'est vraiment difficile de comprendre cette aspect de pointeur je te conseil de faire de exemple et les exécute
FILE* et un type qui contient l'adresse d'un fichier pour pouvoir le manipuler
/* exemple d'ouverture d'un fichier */ #include <stdio.h> int main () { FILE * pFile; // un variable de type FILE* pFile = fopen ("myfile.txt","w");//le variable pFile contient l'adresse fichier "myfile.txt" if (pFile!=NULL) { fputs ("fopen example",pFile); fclose (pFile); } return 0; }
3- une variable constante ne se sera jamais modifier :) c'est le but plus sa ne prend pas de place mémoire je croit
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
1
22 nov. 2009 à 19:45
22 nov. 2009 à 19:45
Maintenant c'est plus clair. beaucoup même :) merci beaucoup.
Et une dernière question, je n'ai pas encore saisi pourquoi on utilise les pointeurs.
le but?
supposons qu'on a une fonction, pour modifier une varible, on donne d'abord son adresse puis on la modifie à souhait, pck si on se contente de la modifier simplement, elle reprend sa valeur initiale à la fin de la fonction.
Moi je crois que cela est vrai pour des fonctions de sortie void ( ne renvoient rien). Mais pourtant il y a des fonctions pas void ( ton exemple avc FILE*, et d'autres), où on utilise des pointeurs.
J'ai beau chercher, je comprend pas le but de l'utilisation des pointeurs.
:p j'espère que tu as une réponse . sauve moi encore. :p
Sinon, merci bcp pr tes autres reponses, c plus clair maintenant.
Et une dernière question, je n'ai pas encore saisi pourquoi on utilise les pointeurs.
le but?
supposons qu'on a une fonction, pour modifier une varible, on donne d'abord son adresse puis on la modifie à souhait, pck si on se contente de la modifier simplement, elle reprend sa valeur initiale à la fin de la fonction.
Moi je crois que cela est vrai pour des fonctions de sortie void ( ne renvoient rien). Mais pourtant il y a des fonctions pas void ( ton exemple avc FILE*, et d'autres), où on utilise des pointeurs.
J'ai beau chercher, je comprend pas le but de l'utilisation des pointeurs.
:p j'espère que tu as une réponse . sauve moi encore. :p
Sinon, merci bcp pr tes autres reponses, c plus clair maintenant.
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
>
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
22 nov. 2009 à 20:14
22 nov. 2009 à 20:14
non
il y a deux type d'utiliser une fonction
fonction(int nb) // si on modifier le contenu de nb dans la fonction
// dans la fonction appellent sa change pas
par conter avec les pionteur
fonction(int* nb)// si on modifier le contenu de nb dans la fonction
//sa valeur est bien modifier
exemple pour bien comprendre pas trops bien fair :)
il y a deux type d'utiliser une fonction
fonction(int nb) // si on modifier le contenu de nb dans la fonction
// dans la fonction appellent sa change pas
par conter avec les pionteur
fonction(int* nb)// si on modifier le contenu de nb dans la fonction
//sa valeur est bien modifier
exemple pour bien comprendre pas trops bien fair :)
#include <stdio.h> int* fonction(int* pt); int fonction2(int nb); int main(){ int nb = 5; int* pt = &nb ; fonction2(nb); printf("\n%d",nb); //affiche 5 fonction(pt); printf("\n%d",nb); //affiche 7 getchar(); return 0; } int* fonction(int* pt){ *pt =*pt+2; return pt; } int fonction2(int nb){ nb=nb+2; return nb; }
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
1
>
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
22 nov. 2009 à 20:50
22 nov. 2009 à 20:50
J'ai pas trop bien compri la fonction "fonction".
On lui donne en entrée l'adresse de *pt, et elle renvoie en sortie l'adresse de *pt+2. alors prk quand on l'a utilisée dans le main ,elle donne plutot en sortit le *pt+2 lui même (5+2) et non l'adresse.
désolée, je sais je pose trop de questions :( mais je trouve les pointeurs trop difficiles.
Merci pour ta patience :)
On lui donne en entrée l'adresse de *pt, et elle renvoie en sortie l'adresse de *pt+2. alors prk quand on l'a utilisée dans le main ,elle donne plutot en sortit le *pt+2 lui même (5+2) et non l'adresse.
désolée, je sais je pose trop de questions :( mais je trouve les pointeurs trop difficiles.
Merci pour ta patience :)
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
>
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
22 nov. 2009 à 21:11
22 nov. 2009 à 21:11
*pt =*pt+2 sa fait la méme chose si on fait nb=nb+2; sa ajout a nb mais pas à *pt 2
si tu affiche *pt tu va pas trouve 5 mais une adresse mémoire "@123456" ou quelque chose "123456"
c'est l'adresse du nb
alors quand tu fait *pt =*pt+2 tu dit ou "débugeur " ajoute la variable qui se trouve a l'adresse "123456" qui bien nb 2
!! comme je dit toujours le pointeur c'est un peut dur a comprendre mais une fois que ta compris c'est facile
!! essayer de faire exemple de pointeur de float char ... pour bien comprendre
si tu affiche *pt tu va pas trouve 5 mais une adresse mémoire "@123456" ou quelque chose "123456"
c'est l'adresse du nb
alors quand tu fait *pt =*pt+2 tu dit ou "débugeur " ajoute la variable qui se trouve a l'adresse "123456" qui bien nb 2
!! comme je dit toujours le pointeur c'est un peut dur a comprendre mais une fois que ta compris c'est facile
!! essayer de faire exemple de pointeur de float char ... pour bien comprendre
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
>
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
22 nov. 2009 à 21:13
22 nov. 2009 à 21:13
oui les pointeurs sont une des choses les plus compliquées à apprendre pour un débutant, (AMHO).
Néanmoins ce n'est pas "trop" compliqué car c'est surement un des outils les plus importants !
Tu trouveras facilement de nombreux tuto qui expliquent pas à pas des exemples avec les pointeurs. Regarde par exemple celui de CCM pointeur C, ou ici https://c.developpez.com/cours/#tutoriels-c , ou là https://cpp.developpez.com/cours/?page=general#cours-cpp .
De plus, le mieux pour comprendre tout ça est d'apprendre certaines bases sur comment la mémoire est organisée dans un ordinateur et comment un programme la gère.
Néanmoins ce n'est pas "trop" compliqué car c'est surement un des outils les plus importants !
Tu trouveras facilement de nombreux tuto qui expliquent pas à pas des exemples avec les pointeurs. Regarde par exemple celui de CCM pointeur C, ou ici https://c.developpez.com/cours/#tutoriels-c , ou là https://cpp.developpez.com/cours/?page=general#cours-cpp .
De plus, le mieux pour comprendre tout ça est d'apprendre certaines bases sur comment la mémoire est organisée dans un ordinateur et comment un programme la gère.
Salut
l'astérisque que tu écris après un type signifie que tu déclares & manipule un pointeur sur une variable du type annoncé:
char * => un pointeur sur un char ; derrière ce char, il y a d'autres char => char * est aussi un pointeur sur une chaine de caractères
FILE * => un pointeur sur une structure FILE
etc...
l'astérisque que tu écris après un type signifie que tu déclares & manipule un pointeur sur une variable du type annoncé:
char * => un pointeur sur un char ; derrière ce char, il y a d'autres char => char * est aussi un pointeur sur une chaine de caractères
FILE * => un pointeur sur une structure FILE
etc...
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
1
22 nov. 2009 à 18:53
22 nov. 2009 à 18:53
merci :)
loupius
Messages postés
697
Date d'inscription
dimanche 1 novembre 2009
Statut
Membre
Dernière intervention
31 décembre 2017
148
22 nov. 2009 à 11:12
22 nov. 2009 à 11:12
FILE est une structure de type opaque, en clair les lambdas moyens que nous sommes n'ont pas besoin de savoir ce qu'elle contient et, surtout, ne doivent pas essayer de manipuler directement un de ses éléments. Si tu veux savoir ce quelle contient, il te suffit de consulter le fichier 'stdio.h' qui, d'ailleurs, te renverra certainement vers un autre fichier plus approprié à ton système d'exploitation. Je ne peux que t'encourager à effectuer une telle démarche car c'est toujours plein d'enseignements, mais, ne sois pas surpris, la lecture de ces fichiers est assez déroutant voire rebutant.
Bonne recherche.
Bonne recherche.
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
1
22 nov. 2009 à 18:55
22 nov. 2009 à 18:55
trop déroutante. Rien ne me semble clair, mais j'essaierai.
Je vais revoir mes cours, et préparer d'autres questions :p merci à tous.
Je vais revoir mes cours, et préparer d'autres questions :p merci à tous.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
22 nov. 2009 à 18:56
22 nov. 2009 à 18:56
ta pas bien compris quoi exactement :)
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
1
22 nov. 2009 à 19:04
22 nov. 2009 à 19:04
1 - c'est quoi le char? d'après ce que je sais c'est les chiffres entre 0 et 276 si je ne me trompe pas. Le type int comprend un intervalle un peu plus large. pourquoi ne peut t on donc pas utiliser le int pour des chaînes de caractères? et pr des caractères?
2- Je ne comprend pas ce que renvoient les fonctions dont le prototype commence par :
- char*
-FILE*
Pour FILE*, c clair la fonction renvoie un pointeur vers une variable de type FiLE, mais c quoi ce type?
hmmmmm quoi d'autre?
Il y a des fonctions pour lesquelles quand on definit le prototype, les parmètres sont suivies de "const", pr dire que telle variable est constante. prk? on peut bien se passer de ce "const" non?
C'est tout pour l'instant :)
2- Je ne comprend pas ce que renvoient les fonctions dont le prototype commence par :
- char*
-FILE*
Pour FILE*, c clair la fonction renvoie un pointeur vers une variable de type FiLE, mais c quoi ce type?
hmmmmm quoi d'autre?
Il y a des fonctions pour lesquelles quand on definit le prototype, les parmètres sont suivies de "const", pr dire que telle variable est constante. prk? on peut bien se passer de ce "const" non?
C'est tout pour l'instant :)
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
>
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
22 nov. 2009 à 19:53
22 nov. 2009 à 19:53
a) Pour le char vs int : char c'est entre 0 et 255 ;) (il y a donc 256 possibilités). Pour le int (et d'ailleurs en fait pour le char aussi), il faut bien comprendre que : 1) oui le int peut contenir des nombres plus grands, c-à-d codés sur plus d'octets que le char, mais 2) tu ne peut jamais être complètement sûr de ce que peut contenir exactement un char ou un int car ça dépend de l'ordinateur ! (plus précisément du compilateur et du processeur pour lequel ton prog est compilé), (Pour avoir un minimum d'infos il faut utiliser la fonction sizeof().)
ensuite pour les chaînes de caractères :
En C, les créateurs du langage (ou plutôt de la "norme", car C est une norme de langage en fait) ont établi une certaine manière de coder ce qu'on appelle les "chaînes de caractères", c'est à dire pour faire simple "un texte".
b) si tu mets des trucs entre guillemets double ce sera considéré comme une chaîne de caractère. "Bonjour" est donc une chaine de caractères, comme "123456". Mais 123456 est un entier, pas une chaine. Bonjour est un nom de variable, pas une chaine.
Jusque là je crois que tu le savais déjà.
b) Ils ont décidé que, pour détailler comment les programmes doivent gérer cette chaine, qu'en fait ce serait un tableau de char. Pourquoi le char ? Car c'est le moins gourmand en mémoire, et qu'à l'époque de la création du C pour faire du texte on n'a besoin de que de codes ASCII, qui sont des nombres entre 0 et 255.
Maintenant, un tableau est en fait une suite de valeurs en mémoire. Je dis suite et c'est très important : dans la mémoire (dans la RAM), les caractères sont effectivement mis à la suite. Les "cases mémoire" ont des adresses qui correspondent à un certain octet.
lorsque tu veux le cinquième caractère, avec nomdelavariablechaine[4] par exemple, en fait le programme va regarder dans la case mémoire qui est 4 "cases" plus loin que la première (nomdelavariabledechaine est en fait presque un pointeur vers nomdelavariablechaine[0])
(en fait, le nom d'un tableau en C est presque comme un pointeur vers le premier élément de ce tableau.)
Le fait que les chaines soient représentées avec des char et pas avec des int est juste une convention, celle des créateurs du C. Ils ont dit que c'était comme ça et c'est tout.
Ensuite :
Exemple pour faire comprendre ce dont je vais parler.
//déclaration et affichage d'une chaine:
Ce que tu passes à printf(), c'est en fait un pointeur vers le début de la chaine, c'est tout. L'argument est de type char [], ce qui est presque char*.
Maintenant, remarque une chose. Chaine est de taille 50. Dans les 50 cases il y a au début les caractères: 'B', 'o', 'n', 'j', 'o', 'u', 'r' (c-à-d les codes ASCII correspondants)
mais ça ne fait que 7 caractères... dans ma Chaine (un tableau de char) il y a la place pour 50 char !
Et dans la mémoire, c'est le bazar, et il y a effectivement des choses dans toutes les autres cases. Des nombres complètement aléatoires a priori.
Pourquoi le printf n'affiche t-il pas tous ces "caractères" parasites ?
Et bien car il sait que la chaine se termine après le 'r'. Comment sait-il ça ? car dans la norme C, en fait les chaînes se terminent par le caractère nul (0 en nombre, qui correspond à '\0' si je ne m'abuse).
Ainsi, la fonction printf est essentiellement une boucle qui écrit chaque caractère du tableau... jusqu'à ce qu'elle tombe sur le caractère nul.
Donc je t'ai menti, dans Chaine il y a 'B', 'o', 'n', 'j', 'o', 'u', 'r', et '\0' ! (et ensuite dans le reste du tableau il y a du bordel aléatoire)
c) pour les const dans les arguments de variables :
a priori, OUI, on pourrait s'en passer. Néanmoins le fait de mettre ces const est une excellent pratique de programmation. Cela signifie à celui qui code un programme en utilisant cette fonction qu'il est sûr que ses arguments ne seront pas modifiés.
Le fait qu'une fonction puisse modifier des arguments peut être une énorme cause de bugs très très difficiles à déceler. En forçant les arguments à être de type const, on s'assure ainsi qu'au moins tout va pour le mieux de ce point de vue.
d) pour le FILE, c'est un struct définit comme on te l'a dit avant dans stdio.h . ça fait partie du standard C. Tu peux très bien aller chercher la définition de FILE dans le fichier stdio.h ;) C'est juste un type standard pour les fonctions d'entrée sortie avec les fichiers.
e) les fonctions renvoient des pointeurs lorsqu'elles créent par exemple des variables struct dynamiquement et qu'elles veulent permettre à la fonction qui les appelle d'utiliser ces variables qu'elles ont crée. Sinon, si elles renvoyaient la struct elle-même, ce serait une copie de la variable crée à l'intérieur de la fonction qui serait renvoyé, ce qui n'est pas toujours désirable (la copie d'une struct énorme prend du temps), et ni toujours possible! Si une fonction veut renvoyer un tableau, elle est obligée en fait de le créer dynamiquement (avec malloc) et de renvoyer un pointeur vers le début du tableau, il me semble.
ensuite pour les chaînes de caractères :
En C, les créateurs du langage (ou plutôt de la "norme", car C est une norme de langage en fait) ont établi une certaine manière de coder ce qu'on appelle les "chaînes de caractères", c'est à dire pour faire simple "un texte".
b) si tu mets des trucs entre guillemets double ce sera considéré comme une chaîne de caractère. "Bonjour" est donc une chaine de caractères, comme "123456". Mais 123456 est un entier, pas une chaine. Bonjour est un nom de variable, pas une chaine.
Jusque là je crois que tu le savais déjà.
b) Ils ont décidé que, pour détailler comment les programmes doivent gérer cette chaine, qu'en fait ce serait un tableau de char. Pourquoi le char ? Car c'est le moins gourmand en mémoire, et qu'à l'époque de la création du C pour faire du texte on n'a besoin de que de codes ASCII, qui sont des nombres entre 0 et 255.
Maintenant, un tableau est en fait une suite de valeurs en mémoire. Je dis suite et c'est très important : dans la mémoire (dans la RAM), les caractères sont effectivement mis à la suite. Les "cases mémoire" ont des adresses qui correspondent à un certain octet.
lorsque tu veux le cinquième caractère, avec nomdelavariablechaine[4] par exemple, en fait le programme va regarder dans la case mémoire qui est 4 "cases" plus loin que la première (nomdelavariabledechaine est en fait presque un pointeur vers nomdelavariablechaine[0])
(en fait, le nom d'un tableau en C est presque comme un pointeur vers le premier élément de ce tableau.)
Le fait que les chaines soient représentées avec des char et pas avec des int est juste une convention, celle des créateurs du C. Ils ont dit que c'était comme ça et c'est tout.
Ensuite :
Exemple pour faire comprendre ce dont je vais parler.
//déclaration et affichage d'une chaine:
char Chaine[50] = "Bonjour"; printf(Chaine);
Ce que tu passes à printf(), c'est en fait un pointeur vers le début de la chaine, c'est tout. L'argument est de type char [], ce qui est presque char*.
Maintenant, remarque une chose. Chaine est de taille 50. Dans les 50 cases il y a au début les caractères: 'B', 'o', 'n', 'j', 'o', 'u', 'r' (c-à-d les codes ASCII correspondants)
mais ça ne fait que 7 caractères... dans ma Chaine (un tableau de char) il y a la place pour 50 char !
Et dans la mémoire, c'est le bazar, et il y a effectivement des choses dans toutes les autres cases. Des nombres complètement aléatoires a priori.
Pourquoi le printf n'affiche t-il pas tous ces "caractères" parasites ?
Et bien car il sait que la chaine se termine après le 'r'. Comment sait-il ça ? car dans la norme C, en fait les chaînes se terminent par le caractère nul (0 en nombre, qui correspond à '\0' si je ne m'abuse).
Ainsi, la fonction printf est essentiellement une boucle qui écrit chaque caractère du tableau... jusqu'à ce qu'elle tombe sur le caractère nul.
Donc je t'ai menti, dans Chaine il y a 'B', 'o', 'n', 'j', 'o', 'u', 'r', et '\0' ! (et ensuite dans le reste du tableau il y a du bordel aléatoire)
c) pour les const dans les arguments de variables :
a priori, OUI, on pourrait s'en passer. Néanmoins le fait de mettre ces const est une excellent pratique de programmation. Cela signifie à celui qui code un programme en utilisant cette fonction qu'il est sûr que ses arguments ne seront pas modifiés.
Le fait qu'une fonction puisse modifier des arguments peut être une énorme cause de bugs très très difficiles à déceler. En forçant les arguments à être de type const, on s'assure ainsi qu'au moins tout va pour le mieux de ce point de vue.
d) pour le FILE, c'est un struct définit comme on te l'a dit avant dans stdio.h . ça fait partie du standard C. Tu peux très bien aller chercher la définition de FILE dans le fichier stdio.h ;) C'est juste un type standard pour les fonctions d'entrée sortie avec les fichiers.
e) les fonctions renvoient des pointeurs lorsqu'elles créent par exemple des variables struct dynamiquement et qu'elles veulent permettre à la fonction qui les appelle d'utiliser ces variables qu'elles ont crée. Sinon, si elles renvoyaient la struct elle-même, ce serait une copie de la variable crée à l'intérieur de la fonction qui serait renvoyé, ce qui n'est pas toujours désirable (la copie d'une struct énorme prend du temps), et ni toujours possible! Si une fonction veut renvoyer un tableau, elle est obligée en fait de le créer dynamiquement (avec malloc) et de renvoyer un pointeur vers le début du tableau, il me semble.
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
17
>
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
22 nov. 2009 à 20:02
22 nov. 2009 à 20:02
char n'est pas un int
char nb1='1' et char nb2='2'
nb1+nb2 ne donne pas 2
char nb1='1' et char nb2='2'
nb1+nb2 ne donne pas 2
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
>
nobie-cs
Messages postés
155
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
15 mai 2010
22 nov. 2009 à 20:12
22 nov. 2009 à 20:12
oui mais il me semblait qu'il l'avait compris, cela.
néanmoins nb1+nb2 est valide car ce sont des nombres finalement (et ne donne pas deux mas bien la somme des codes caractère de '1' et '2').
néanmoins nb1+nb2 est valide car ce sont des nombres finalement (et ne donne pas deux mas bien la somme des codes caractère de '1' et '2').
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
1
>
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
22 nov. 2009 à 21:21
22 nov. 2009 à 21:21
oui j'ai compri cela parfaitement.
Et je suis une fi-fille :p
en tt cas, merci
Et je suis une fi-fille :p
en tt cas, merci
Pacorabanix
Messages postés
3248
Date d'inscription
jeudi 23 août 2007
Statut
Membre
Dernière intervention
19 mai 2013
662
22 nov. 2009 à 20:25
22 nov. 2009 à 20:25
En fait, il faut que tu considère un pointeur comme un panneau.
Tu as appris que les arguments d'une fonction sont passés "par valeur", c-à-d par copie et ne peuvent en général pas être modifiés?
Et bien lorsque tu passes un pointeur à une fonction, tu ne peux pas modifier le pointeur, c-à-d tu ne peux pas modifier ce qu'il y a écrit sur le panneau, mais tu peux tout-à-fait modifié le truc vers quoi le pointeur pointe !!!
C'est pour cela qu'on rajoute const. si on rajoute const, on force la fonction à ne pas permettre de modifier l'objet pointé.
Sinon aïe aïe aïe les bugs qui peuvent arriver avec les pointeurs...
De plus, pour le fait que les fonctions renvoient un pointeur, c'est une question d'efficacité.
Si tu as une struct très grosses
struct GrosseStruct {
//ici : 1200 variables... ou par exemple des tableaux de milliers de valeurs
}
Si tu faisais une fonction qui va, par exemple, créer dynamiquement une grosseStruct à partir de je-ne-sais-quoi, d'une part si tu renvoyais simplement un GrosseStruct, alors cette GrosseStruct serait entièrement copiée, ce qui peut prendre de l'espace mémoire considérable et du temps d'exécution.
De plus, si tu la crées dynamiquement et qu'elle est copiée, alors l'original n'est pas détruit correctement avec free() ! Problème de "fuite de mémoire" (Memory leak) difficile à déceler et qui créera peut-être des problèmes plus tard, mais pas forcément de bug apparent.
Tu as appris que les arguments d'une fonction sont passés "par valeur", c-à-d par copie et ne peuvent en général pas être modifiés?
Et bien lorsque tu passes un pointeur à une fonction, tu ne peux pas modifier le pointeur, c-à-d tu ne peux pas modifier ce qu'il y a écrit sur le panneau, mais tu peux tout-à-fait modifié le truc vers quoi le pointeur pointe !!!
C'est pour cela qu'on rajoute const. si on rajoute const, on force la fonction à ne pas permettre de modifier l'objet pointé.
Sinon aïe aïe aïe les bugs qui peuvent arriver avec les pointeurs...
De plus, pour le fait que les fonctions renvoient un pointeur, c'est une question d'efficacité.
Si tu as une struct très grosses
struct GrosseStruct {
//ici : 1200 variables... ou par exemple des tableaux de milliers de valeurs
}
Si tu faisais une fonction qui va, par exemple, créer dynamiquement une grosseStruct à partir de je-ne-sais-quoi, d'une part si tu renvoyais simplement un GrosseStruct, alors cette GrosseStruct serait entièrement copiée, ce qui peut prendre de l'espace mémoire considérable et du temps d'exécution.
De plus, si tu la crées dynamiquement et qu'elle est copiée, alors l'original n'est pas détruit correctement avec free() ! Problème de "fuite de mémoire" (Memory leak) difficile à déceler et qui créera peut-être des problèmes plus tard, mais pas forcément de bug apparent.
seljazou
Messages postés
175
Date d'inscription
dimanche 6 septembre 2009
Statut
Membre
Dernière intervention
25 décembre 2009
1
22 nov. 2009 à 20:42
22 nov. 2009 à 20:42
Merci, chacun d'entre vous me donne une nouvelle information.
Mais ne connais tu pas des sites où je peux trouver des exemples de protoypes de fonctions et de definitons de fonctions. ( surtout les definitions), des exemples pas trop compliqués, où il y a des fonctions dont les paramètres sont des pointeurs, des fonctions qui renvoient des pointeurs sur char, sur FILE, .... sur d'autres structures. je crois que 'est ce qui m'aiderait le plus à comprendre.
Merci beaucoup;
Mais ne connais tu pas des sites où je peux trouver des exemples de protoypes de fonctions et de definitons de fonctions. ( surtout les definitions), des exemples pas trop compliqués, où il y a des fonctions dont les paramètres sont des pointeurs, des fonctions qui renvoient des pointeurs sur char, sur FILE, .... sur d'autres structures. je crois que 'est ce qui m'aiderait le plus à comprendre.
Merci beaucoup;