10.2: Punteros y Estructuras
( \newcommand{\kernel}{\mathrm{null}\,}\)
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í:
1 | 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:
1 | ptransistor->currentgain = 200.0; |
2 | strcpy( ptransistor->model, “2N3904” ); |
A continuación se muestra una función que simplemente imprime los valores de los diversos campos.
1 | void print_transistor( struct transistor *pt ) |
2 | { |
3 | printf(“For model: %s\n”, pt->model ); |
4 | printf(“Current gain is %lf\n”, pt->currentgain ); |
5 | printf(“Breakdown voltage is %lf\n”, pt->breakdown ); |
6 | printf(“Maximum power is %lf\n”, pt->maxpower ); |
7 | } |
8 | /* 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í:
1 | print_transistor( &my_transistor ); |
2 |
3 | /* we could also use print_transistor( ptransistor ); |
4 | if we initialized it as above */ |