Saltar al contenido principal

10.2: Punteros y Estructuras

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\id}{\mathrm{id}}$$ $$\newcommand{\Span}{\mathrm{span}}$$

( \newcommand{\kernel}{\mathrm{null}\,}\) $$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$ $$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$ $$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\id}{\mathrm{id}}$$

$$\newcommand{\Span}{\mathrm{span}}$$

$$\newcommand{\kernel}{\mathrm{null}\,}$$

$$\newcommand{\range}{\mathrm{range}\,}$$

$$\newcommand{\RealPart}{\mathrm{Re}}$$

$$\newcommand{\ImaginaryPart}{\mathrm{Im}}$$

$$\newcommand{\Argument}{\mathrm{Arg}}$$

$$\newcommand{\norm}[1]{\| #1 \|}$$

$$\newcommand{\inner}[2]{\langle #1, #2 \rangle}$$

$$\newcommand{\Span}{\mathrm{span}}$$ $$\newcommand{\AA}{\unicode[.8,0]{x212B}}$$

$$\newcommand{\vectorA}[1]{\vec{#1}} % arrow$$

$$\newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow$$

$$\newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vectorC}[1]{\textbf{#1}}$$

$$\newcommand{\vectorD}[1]{\overrightarrow{#1}}$$

$$\newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}}$$

$$\newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}}$$

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

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 */


This page titled 10.2: Punteros y Estructuras is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.