Page 168

3.5 Paso de par´ametros

El & de los par´ ametros de scanf Ahora ya puedes entender bien por qu´e las variables escalares que suministramos a scanf para leer su valor por teclado van precedidas por el operador &: como scanf debe modificar su valor, ha de saber en qu´e direcci´ on de memoria residen. No ocurre lo mismo cuando vamos a leer una cadena, pero eso es porque el identificador de la variable ya es, en ese caso, una direcci´ on de memoria.

variable.) O sea, C interpreta *a como accede a la variable apuntada por a, que es b, as´ı que *a += 1 equivale a b += 1 e incrementa el contenido de la variable b. ¿Qu´e pasar´ıa si en lugar de *a += 1 hubi´esemos escrito a += 1? Se hubiera incrementado la direcci´on de memoria a la que apunta el puntero, nada m´as. ¿Y si hubi´esemos escrito a++? Lo mismo: hubi´esemos incrementado el valor de la direcci´on almacenada en a. ¿Y *a++?, ¿funcionar´ıa? A primera vista dir´ıamos que s´ı, pero no funciona como esperamos. El operador ++ postfijo tiene mayor nivel de precedencia que el operador unario *, as´ı que *a++ (post)incrementa la direcci´on a y accede a su contenido, por ese ´orden. Nuevamente habr´ıamos incrementado el valor de la direcci´on de memoria, y no su contenido. Si quieres usar operadores de incremento/decremento, tendr´as que utilizar par´entesis para que los operadores se apliquen en el orden deseado: (*a)++. Naturalmente, no s´ olo puedes acceder as´ı a variables locales, tambi´en las variables globales son accesibles mediante punteros: referencia global.c

referencia global.c 1

#include <stdio.h>

2 3

int b; // Variable global.

4 5 6 7 8

void incrementa( int * a ) { *a += 1; }

9 10 11 12 13 14 15 16 17

int main(void) { b = 1; printf ("Al principio b vale %d\n", b); incrementa( &b ); printf ("Y al final vale %d\n", b); return 0; }

El aspecto de la memoria cuando empieza a ejecutarse la funci´on incrementa es ´este: variables globales

incrementa

a llamada desde l´ınea 14

main

b 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 178 Dise˜ na un procedimiento que modifique el valor del par´ametro de tipo float para que valga la inversa de su valor cuando ´este sea distinto de cero. Si el n´ umero es cero, el procedimiento dejar´ a intacto el valor del par´ametro. Si a vale 2.0, por ejemplo, inversa(&a) har´a que a valga 0.5. · 179 Dise˜ na un procedimiento que intercambie el valor de dos n´ umeros enteros. Si a y b valen 1 y 2, respectivamente, la llamada intercambia(&a, &b) har´a que a pase a valer 2 y b pase a valer 1. · 180 Dise˜ na un procedimiento que intercambie el valor de dos n´ umeros float. 162

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement