|
Dernière réponse | |
---|---|
Sujet : Quelques questions basiques en C | |
HelloWorld | (char) * chaine => pointeur sur un char
(char *) * chaine => pointeur sur un (char *) ca change rien ... ;) |
Aperçu |
---|
Vue Rapide de la discussion |
---|
HelloWorld | (char) * chaine => pointeur sur un char
(char *) * chaine => pointeur sur un (char *) ca change rien ... ;) |
Titoine42 |
[edit]--Message édité par titoine42--[/edit] |
BENB |
|
HelloWorld | 2 précision, quand je dis :
|
DuffBeer | rufo> dans ce cas tu es d'accord avec moi, mais lorque tu dis passage par adresse c'est passage par pointeur. Si chacun utilise ses propres termes, moi je vais :pt1cable: |
rufo |
|
DuffBeer | HelloWorld> Tu as globalement saisi ce que j'ai voulu dire mais je me perd dans tes explications :crazy: BENB> J'admet que je me suis tromper dans le terme utilisé, en effet c'est l'adresse contenue par le pointeur qui est passé donc la valeur du pointeur (sur ce point tu as raison). Mais si tu relis ce que j'ai expliqué tu remarquera qu'on a le même raisonnement : un passage par pointeur est en fait une sorte de passage par valeur sauf qu'il permet de modifier directement la variable pointé (propriété inhérente au pointeur). Ensuite, il n'y a pas de philosophie dans l'utilisation de langage de prog mais juste une terminologie. Or j'insiste sur le fait qu'il n'y a que deux types de passage en C et deux autres en plus en C++ (le passage par référence qui équivaut à votre passage par adresse mais j'insiste sur le terme référence). Et il n'y a pas d'émulation en C du passage par référence :
[edit]--Message édité par DuffBeer--[/edit] |
BENB | Je suis desolee de ne pas etre de votre avis. Construire des theories compliquees ne change rien...
Comme le dit BifaceMcLeod il est possible d'emuler un passage par adresse en C mais il doit etre "explicite" 1- l'appelant doit explicitement passer l'adresse 2- l'appele doit explicitement recevoir une adresse Vouloir cacher cela conduit a des erreurs tels que "on passe l'adresse du pointeur"... ce qui est faux... (ceci a ete dit et par DuffBeer et par HelloWorld) Un pointeur est une variable comme une autre il a une adresse : la sienne, et une valeur (qui se trouve, normalement, etre l'adresse d'une autre variable) un vrai passage par adresse est un passage ou : -l'appeleant indique la variable (et non l'adresse de celle-ci) -l'appeler recupere une variable (et non un pointeur sur celle-ci) qui est la meme physiquement que celle qui a ete passee, et non une copie. Je ne vois pas de philosophie ici. oh_damned > oui je pense que c'est de la pedagogie mal placee. Il vaut mieux comprendre ce qui se passe reelement. Mais le veritable probleme vient des pointeur qui sont trop souvent mis a part par rapport aux autres variables, d'ou l'expression malheureuse de "Adresse du pointeur" pour designer sa valeur ! |
gilou | Et c'est relativement simple. Le passage par nom, par contre...
Ceux qui comme moi, ont implemente un compilo algol, en savent qque chose. A+, |
BifaceMcLeOD | La notion de "passage par valeur" et "passage par référence" se fait toujours par rapport au source. C'est pour cela que C ne connaît que le passage par valeur. Parce qu'on doit explicitement passer la référence lors de l'appel, puis la déréférencer dans la fonction. |
oh_damned | parfois un petit exemple vaut mieux qu'un long discours :
void swap(int *a,int *b){ int temp = *a; *a = *b; *b = temp; } void print(int a,int b){ printf("%d,%d\n",a,b); } //... swap(&val_1,&val_2); print(val_1,val_2); //... on "passe" à swap les adresses de val_1 et de val_2, on peut donc dire que val_1 et val_2 sont "passées" par référence à swap tandis qu'à print on "passe" val_1 et val_2 par valeur en fait ici, tout le monde parle de la même chose, mais chacun à sa façon, c'est ce qui créé la mésentente de certains dans l'absolu en C, les paramètres sont toujours passés par valeur, mais certaines de ces valeurs peuvent être des pointeurs, certains enseignants dans un but pédagogique disent dans ce cas que les paramètres sont passés par adresse, et mal interprété c'est vrai que cela peut créer des confusions chez les élèves |
gilou | Tout ca c'est une question de point de vue:
Du point de vue du compilo, tout est passe par valeur. Du point de vue du codeur, plutot que dire qu'il a passe pas valeur l'adresse de sa variable, il dira qu'il a passe (par valeur) un pointeur sur sa variable. Car etant donne un prototype de fonction avec: mafonction(montype *p); meme si on appelle cette fonction avec: mafonction(&mavariable); du point de vue de l'implementation de mafonction, on va travailler avec le parametre p, un pointeur. A+, [edit]--Message édité par gilou--[/edit] |
HelloWorld | merde, fallait que je prenne mes enfants à la sortie de l'école à 16H30 !!! |
wouatouwouatou | yen a ki ont vraiment rien a faire de la journee :D |
HelloWorld | :lol: :lol: :lol:
on est en train de dire la meme chose ... => je trouve que ce que tu viens de dire est exactement ce que j'ai écris (= ce ke je me tue à te dire :lol:) ce que je voulais dire nivo compilo/code, ben tu en donnes encore l'exemple : tout est libre interpretation : "Ces deux passages ont le même effet, dans la premier cas c'est la variable qui est copier dans la pile de contexte et dans le second c'est l'adresse du pointeur. NON CE N'EST CERTAINEMENT PAS L'ADRESSE DU POINTEUR qui est passe mais bien sa valeur... (qui est une adresse)" ben ... a mon avis l'auteur voulais parler de l'adresse contenue dans le pointeur et pas de l'adresse du pointeur ... mais la phrase ne permet pas de trancher ... pour etre sur :
toutes les autres variables sont passées par valeurs, ce qui est toujours le cas en C pour une variable
:sweat:
|
BENB | HelloWord > tu t'embrouilles...
En C tout est passe par valeur, structure, union, scalaires, et pointeur On ne passe jamais un fonction mais toujours un pointeur de fonction (voir plus haut) et ce pointeur est passe par valeur... Si ta structure fais 100 ko le compilo doit copier 100ko dans la pile K&R -> pour passer la copie d'un tableau le mettre dans un structure (en tant que tableau bien sur pas en tant que pointeur) normalement tu doit touver dans la pile la valeur de ce que tu passe... en FORTRAN on passe par adresse, toujours par adresse, dans la pile tu trouves les adresses des parametres qui ont ete passes Si tu prefere te dire que le Fortran passe par valeur des pointeurs sur les arguments libre a toi... ...Mais pourquoi faire si complique... ...alors que c'est si simple |
BENB | HelloWorld >
il n'y a pas de pointeurs en FORTRAN 77. tout est passe par adresse, c'est dire que quand j'ecris CALL FCT(TOTO) ! c'est l'adresse de Toto qui est empilee... en C quand j'ecrit fct(toto); c'est la valeur de toto qui est empilee... en voulant simplifier/expliquer tu ajoutes une erreur en C tu peux faire fct (&toto) dans ce cas tu passe l'adresse de toto... ... et la fonction recupere un pointeur sur toto...
|
HelloWorld | ouai ouai ... je saisi ce ke tu as voulu dire ... en fait ca depend ou on se place : au niveau du compilateur C ou au niveau du langage C = ce que tu as écris ...
toi t'es au nivo compilo : il passe tout par valeur et nous nivo code : on a passé par reference ... mais si t'es au nivo compilo, le compilo FORTRAN il passe lui aussi par valeur ... ou alors ... il passe par valeur la reference a une variable ... contrairement au C qui passe la valeur de la variable qu'on lui fourgue, le FORTRAN passe par valeur l'adresse de la variable qu'on lui fourgue ... mouai ... je pige maintenant ce ke t'as dit ... comme je l'avais dit au debut : on est proche du debat philosophique... n'empeche qu'on est au nivo code :P => "tout structure(struct ou union) est transmise par adresse " et pas au nivo compilo :na: donc : "toute fonction est transmise par valeur" moi je repond faux ... toi tu aurais dit vrai je suppose ? c'est l'adresse de la fonction qui est passee par valeur ... et pas elle ... |
HelloWorld | on s'est pas tres bien compris ...
je voudrais juste que tu m'explique comment le FORTRAN il arrive à passer par reference ... en suivant ton raisonnement, tu dis que à partir du moment où une adresse est passée par valeur (ben c'est obligé non ???), alors un pointeur est passé par valeur alors tout est passé par valeur en C ... comment cela peut il etre different dans un autre langage, comme le FORTRAN :??: je sais tres bien que tous les langages ne passent pas par valeur (VB : ByVal, ByRef ...) mais c'est par defaut qu'on parle ... le C passe tout par valeur ... si je donne l'adresse de ma chaine, je passe par reference on est d'accord ... donc je viens de passer par reference ? donc le C ne passe pas tout par valeur ! tu sembles confondre le fait qu'un pointeur est passé (comme n'importe quoi) par valeur et qu'un objet est passé par ce pointeur ... à partir du moment où on passe un pointeur, c'est pas du pointeur qu'on se soucit, mais de l'objet pointé ... celui-ci est donc passé par référence ... bien que le pointeur soit passé par valeur ... mais je pense que t'avais bien compris ca .. ;) juste pour dire que : En C, il y a deux types de passage : Le passage par valeur (variable non pointeur) Le passage par pointeur (variable pointeur) Ces deux passages ont le même effet, dans la premier cas c'est la variable qui est copier dans la pile de contexte et dans le second c'est l'adresse du pointeur. me semble tout a fait juste et je pense aussi que cela ne contredit pas (au contraire) ce que tu as dit ! |
BENB | HelloWord > Non je dis en C tout est passe par valeur, si tu passe une adresse par valeur, l'adresse ne change pas ! heureusement...
donc si c'est l'adresse de ta chaine qui est passee, c'est que ta chaine est passe par adresse... Le FORTRAN passe tout par reference par exemple... donc tout les langages ne passent pas par valeur DeffBeer > non les pointeurs sont aussi passes par valeur... d'ailleurs si on modifie la valeur du pointeur (pas la valeur pointee) dans la fonction celui n'est pas modifie dans l'appelant pour simuler un passge de pointer par adresse il faut utiliser un pointeur de pointeur... le C++ passe par valeur par default, on peut changer ce comportement en utilisant un passge par reference. de meme le Pascal passe par valeur, mais on peux exiger un passage par adresse (ou reference) avec le var... |
DuffBeer | En C, il y a deux types de passage :
Ces deux passages ont le même effet, dans la premier cas c'est la variable qui est copier dans la pile de contexte et dans le second c'est l'adresse du pointeur.
Dans ces deux passages, il n'y a pas de copie dans la pile de contexte. En effet, la fonction travaille directement sur la variable principale d'où le passage par référence constante qui empêche de la manipuler.
[edit]--Message édité par DuffBeer--[/edit] |
HelloWorld | "en fait elle prend un pointeur de fonction..."
mais une fonction est un pointeur ... vers du code executable ... ;) j'oubliais : "en C tout est toujours passe par valeur" selon ce raisonnement, tout est toujours passe par valeur dans tous les langages ... => "en C, les parametres sont par defaut passe par valeur" |
HelloWorld | :??: BENB
en C tout est toujours passe par valeur :??: c'est un peu incomplet ... tu sembles dire : void fonction_a_la_con(char * chaine); chaine est un pointeur, c'est a dire une adresse, cette adresse est passée par valeur, donc la chaine est passee par valeur ... :??: on est proche du debat philosophique ... je pense qu'il vaut mieux dire : quand pointeur : passage par reference quand pas pointeur : passage par valeur ... au moins y'a pas d'ambiguite (j'espere) pour un gars qui tente de piger ... on peut ajouter que la reference est passe par valeur ... ;) |
BENB |
|
wouatouwouatou | une fonction peut en effet prendre une autre fonction en parametre... mais dans ce cas, il fo preciser le nombre de parametre kelle prend et la liste des parametres.... |
BENB |
|
Titoine42 | [citation]
a) les paramètres de type simple sont passés par adresse [/citation] Ca veut dire quoi ça? T'es sur que c'est un vrai prof qui vous file ces questionnaires ;) |
nkth | pour ce qui est des valeurs de fonction je pense que la prof parle de la transmission d'un paramètre de type fonction à une autre fonction
merci BENB |
BENB | 1a double (*toto)(...);
1b struct elem* toto[SIZE]; 1c int* (*toto)(...); 1d struct easy* toto(int*,float*); essais de comprendre pourquoi... 2/3 en C tout est toujours passe par valeur. les tableau etant en fait des pointeurs c'est la valeur du pointeur qui est passee ce qui revient a un passage par adresse. Qu'entends tu par valeur d'une fonction ? on ne peut avoir qu'un pointeur sur une fonction... [edit]--Message édité par BENB--[/edit] |
wouatouwouatou | Euh... tu nous fait passer un test :??: taura certainement pas bcp de reponses :D
En plus, je vois meme pas tes reponses ? tu as essayé d'y repondre ? et donne des justifications a tes reponses... Car je pense kici, les forumeurs sont plus du genre a te dire comment on fait ca et pkoi c kom ca plutot ke de dire "oui c ca" point final... [edit]--Message édité par wouatouwouatou--[/edit] |
nkth | Salut
Je suis en DEUG MIAS et je prépare un examen sur l?algorithmique en C Et voilà quelques questions sur lesquelles je ne suis pas sûr de moi : (ces questions ont été posées en examen tellesquelles) 1 Déclarer en langage C les variables suivantes : a) pointeur sur fonction retournant un réel double précision b) tableau de pointeurs sur objet de type « struct elem » c) adresse d?une fonction retournant un « tableau » de réels d) fonction (possédant 2 arguments :p1 tableau d?entiers et p2 : adresse d?un réel) retournant l?adresse d?un objet de type struct easy 2 Les affirmations suivantes, concernant la transmission des paramètres de fonctions, sont elles vraies ou fausses : a) toute variable simple (et non pointeur) est transmise par valeur b) tout structure(struct ou union) est transmise par adresse c) toute fonction est transmise par valeur 3 Lors de l?évaluation des paramètres effectifs d?un appel de fonction, les règles suivantes sont elles vraies ou fausses : a) les paramètres de type simple sont passés par adresse b) les tableaux sont toujours passés par adresse c) les structures sont toujours passées par valeur d) les fonctions sont toujours passées par valeur merci d?essayer d? y répondre |