10.2: Punteros y Estructuras
- Page ID
- 82385
Generalmente no es una buena práctica enviar estructuras enteras a funciones como argumentos. El motivo es porque terminas copiando muchos datos. La estructura del transistor anterior contiene tres dobles
s a 8 bytes cada uno, un int corto
a 2 bytes y 20 bytes para la matriz char
, dejando un total de 46 bytes de memoria que necesitan ser copiados si pasamos esto a una función. Sería mucho más eficiente si simplemente pasáramos la dirección inicial de la estructura a la función. Es decir, le decimos a la función dónde encontrar la estructura mediante el uso de un puntero (esto se llama “pasando por referencia” versus el más familiar “pasando por valor”). Es por ello que declaramos ptransistor
. Lo inicializamos así:
ptransistor = &my_transistor;
Para acceder a los diversos campos, ya no podemos usar el periodo porque ya no tenemos un transistor struct
; tenemos un puntero a uno. Para los punteros, accedemos a los campos a través del token de puntero, que se compone de un guión seguido de un signo mayor que: ->
Así, podríamos decir:
ptransistor->currentgain = 200.0; strcpy( ptransistor->model, “2N3904” );
A continuación se muestra una función que simplemente imprime los valores de los diversos campos.
void print_transistor( struct transistor *pt ) { printf(“For model: %s\n”, pt->model ); printf(“Current gain is %lf\n”, pt->currentgain ); printf(“Breakdown voltage is %lf\n”, pt->breakdown ); printf(“Maximum power is %lf\n”, pt->maxpower ); } /* note use of %s for string and %lf for “long float” i.e., double */
Pasamos la función un puntero a una estructura de transistor así:
print_transistor( &my_transistor ); /* we could also use print_transistor( ptransistor ); if we initialized it as above */