Passar paràmetres per referència amb C
Salta a la navegació
Salta a la cerca
Com sempre, no convé abusar de les variables globals. Passar paràmetres per referència és la manera de tenir definida una variable localment, per ex char *vid_foto_flickr; en el segon exemple, i aquesta variable la passo per referència a d'altres procediments o funcions, on allà es pot canviar el valor de la variable. Aquest aclariment respon a un cas real quan estava programant amb l'API de Flickr, en què la variable vid_foto_flickr no es passa una vegada, sinó dues (fa dos salts), amb la qual cosa s'organitza un embolic que s'ha de desembolicar. Un cop aclarit, s'ha utilitzat a upload2flickr.c
aclaratori_punters.c:
//$ gcc -o aclaratori_punters aclaratori_punters.c
// hi ha diferència de sintaxi entre fer-ho amb C i amb C++:
//http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr233.htm
#include <stdio.h>
char * crida_funcio (char *, int *, char *, char **);
int main(int argc, char *argv[])
{
char *var1;
int val1;
char var2;
char *var3;
char *res;
var1="hola1";
val1=10;
var2='h';
var3="camió";
res = crida_funcio(var1, &val1, &var2, &var3);
printf("%s %d %c %s\n", res, val1, var2, var3);
}
char *crida_funcio(char *v1, int *valor, char *v2, char **v3) {
char *a2;
printf("aaa %d\n",*valor);
a2=v1;
*valor=5;
*v2='a';
*v3="bicicleta";
return a2;
}
aclaratori_punters2.c:
//$ gcc -o aclaratori_punters aclaratori_punters.c
// hi ha diferència de sintaxi entre fer-ho amb C i amb C++:
//http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr233.htm
#include <stdio.h>
int command_upload(char **);
int print_upload_status(char ***);
int main(int argc, char *argv[])
{
char *vid_foto_flickr;
int res;
vid_foto_flickr="cotxe";
printf("%s\n", vid_foto_flickr);
res = command_upload(&vid_foto_flickr);
printf("%s\n", vid_foto_flickr);
}
int command_upload(char **vid_foto_flickr_a) {
int res;
*vid_foto_flickr_a="bicicleta";
printf("--%s\n",*vid_foto_flickr_a);
res = print_upload_status(&vid_foto_flickr_a);
printf("---%s\n",*vid_foto_flickr_a);
return 1;
}
int print_upload_status(char ***vid_foto_flickr_b) {
**vid_foto_flickr_b="moto";
printf("--%s\n",**vid_foto_flickr_b);
return 1;
}
creat per Joan Quintana Compte, abril 2012