Вы находитесь на странице: 1из 12

Punteros

Un puntero es un tipo de variable que permite almacenar y manipular las direcciones de


memoria donde se encuentran almacenados los datos, en lugar de los datos mismos. El
manejo de punteros en el lenguaje C es muy poderoso y eficiente, aunque demanda
extremo cuidado en su utilizacin.
Bien utilizado ace que el cdigo sea m!s compacto y eficiente" por el contrario, su uso
descuidado lleva a tener poca claridad y frecuentemente conduce a la p#rdida del
control de la corrida, ocasionando un comportamiento indeseable del proceso.
El uso de punteros nos permite acceder al valor de una variable en forma indirecta. $ara
esto se utilizan dos operadores%
& El operador &direccin de memoria de& que permite obtener la direccin de
memoria donde se aloja la variable a la cual precede ' &x es la direccin de
memoria de x(.
* El operador &contenido de lo apuntado por& que permite acceder al valor
almacenado en la direccin de memoria que indica el puntero al cual precede '
*px es el contenido de lo apuntado por px(
Declaracin
)as declaraciones de los punteros se realizan en forma indirecta, declarando el tipo de
dato que ser! apuntado por el mismo. $or ejemplo un puntero a un dato de tipo entero se
declara como%
int *px;
*ean adem!s x e y dos variables del tipo entero. Existen dos operadores unarios para
usarlos con punteros%
Inicializacin
Antes de poder ser utilizado, un puntero debe ser inicializado 'como cualquier otra
variable(. $ara inicializar un puntero se puede utilizar%
a. la direccin de memoria de otra variable
int y=2, *py;
py = &y;
b. el valor de otro puntero ya inicializado.
int y=2, *py = &y, *ppy;
ppy = py;
+
Pasaje de argumentos por referencia
*upongamos que queremos realizar una funcin que recibe dos argumentos y que debe
retornar como resultado los valores invertidos de las dos variables. *ea por ejemplo la
siguiente implementacin de esta funcin%
void Swap(int x, int y)
{
int Temp;
Temp = x;
x = y;
y = temp;
}
El efecto de esta funcin no es el deseado, ya que las variables son pasadas por valor, es
decir que lo que se modifica no son las variables originales, sino copias de ellas. )a
forma de acer esta operacin es a trav#s del paso de los argumentos por referencia. En
C esto se implementa aciendo uso de punteros%
void Swap(int *x, int *y)
{
int Temp;
Temp = *x;
*x = *y;
*y = Temp;
}
Como lo que se est!n pasando a la funcin *,ap son en realidad direcciones de
memoria donde est!n alojadas las variables originales almacenadas, las modificaciones
que se realizan afectan estos valores. )a invocacin de esta funcin debe ser de la
forma%
Swap(&a,&b);
//Programa que suma un valor a una variable a travs de
un //puntero.
#include <stdio.h>
#include <conio.h>
int main()
{
int a, p!
a"#!
p"$a!
p%"&!
print'(()n*l valor 'inal de a es+ ,d(, a)!
getch()!
-
-
Estructuras, .ypedef, /rreglos de Estructuras
Una estructura es un conjunto de datos, posiblemente de tipos diferentes, agrupadas bajo
un mismo nombre, para acer m!s eficiente su manejo.
)as estructuras ayudan a organizar datos complicados, particularmente en programas
grandes, ya que permiten tratar como una unidad a un conjunto de variables
relacionadas, en lugar de tratarlas como entidades independientes.
Un buen criterio de uso de estructuras establece que la definicin de una estructura debe
ir acompa0ada por la definicin de un conjunto de funciones que se encargan de realizar
la manipulacin directa de la nueva entidad creada.
Definicin de estructuras en Lenguaje C
Una estructura se define en lenguaje C a trav#s de la siguiente sintaxis%
struct .ombre
{
tipo/ 0ampo/!
tipo1 0ampo1!
...
tipo. 0ampo.!
-!
)a declaracin
struct .ombre 2ar/!
1eclara una variable del tipo &struct 2ombre&, esto es, el compilador reserva la cantidad
de memoria suficiente para mantener la estructura 3ntegra 'es decir espacio para
almacenar Campo+, Campo-, ..., Campo2(. Cuando se ace referencia a la variable 4ar,
se esta aciendo referencia a la estructura 3ntegra.
Inicializacin de estructuras
*e puede inicializar una estructura externa o est!tica a0adiendo a su definicin la lista
de inicializadores%
struct 3echa
{
int 4ia!
char 5es6/78!
int 9nio!
-!
5
struct 3echa :o; " {<,(5a;o(,/==/-,
2ar3echa!
...
2ar3echa " :o;!
)a asignacin 4ar6eca 7 8oy copia la estructura integra 8oy en 4ar6eca. Cuando
dentro de los campos de una estructura aparecen arreglos de caracteres y se realiza este
tipo de asignacin, se esta copiando tambi#n arreglos de caracteres.
Referencia de campos de una estructura
Un campo de una estructura se utiliza como una variable m!s. $ara referenciar un
campo de una estructura se emplea el operador &.&
Ejemplos%
:o;.4ia " 1>!
:o;.9nio " /==/!
print'(?*l mes es+ ,s)n(,:o;.5es)!
Ejemplo para verificar a0o bisiesto%
(3echa.9nio , > "" 7) $$ (3echa.9nio , /77 @" 7)) AA
(3echa.9nio , >77 "" 7)
)as estructuras se pueden anidar%
struct Person
{
char .ame 6.95*BCD*8!
char 9dress694EBCD*8!
long Dip0ode!
double Balar;!
struct 3echa .acimiento!
-!
$ara referenciar un campo de una estructura interna se utiliza la misma sintaxis,
referenciando campos internos dentro de campos%
struct Person Fuan!
Fuan..acimiento.4ia " />!
9
Arreglos de structuras
Es posible agrupar un conjunto de elementos de tipo estructura en un array. Esto se
conoce como array de estructuras%
struct trabaGador
{
char nombre6178!
char apellidos6>78!
int edad!
-!
struct trabaGador 'iGo6178!
/s3 podremos almacenar los datos de -: trabajadores. Ejemplos sobre como acceder
a los campos y sus elementos% para ver el nombre del cuarto trabajador, fijo;5<.nombre".
$ara ver la tercera letra del nombre del cuarto trabajador, fijo;5<.nombre;-<". $ara
inicializar la variable en el momento de declararla lo aremos de esta manera%
struct trabaGador 'iGo6178"{{(Fos(,(:errero
5artHneI(,1=-,{(Juis(,(KarcHa BLncheI(,>M--!
!ypedef
El lenguaje =C= dispone de una declaracin llamada typedef que permite la creacin
de nuevos tipos de datos. Ejemplos%
t;pede' int entero!
/ crear un tipo de dato llamado entero /
entero a, b"N!
/ declaramos dos variables de este tipo /
*u empleo con estructuras est! especialmente indicado. *e puede acer de varias
formas%
Una forma de acerlo%
struct trabaGador
{
char nombre6178!
char apellidos6>78!
int edad!
>
-!
t;pede' struct trabaGador datos!
datos 'iGo,temporal!
?tra forma%
t;pede' struct
{
char nombre6178!
char apellidos6>78!
int edad!
-datos!
datos 'iGo,temporal!
jemplos"
+.@ 4eamos antes que, adem!s de int, car y float, otros tipos de datos simples son las
enumeraciones o tipos enumerados, donde se listan las constantes del tipo. Este tipo se
declara con la palabra reservada enum, como un conjunto de constantes enteras
representadas por identificadores. $or ejemplo%
enum ComunidadUniveritaria
{obrero,adminitrativo,etudiante, pro!eor};
)os valores de una enumeracin se inician con : a menos que se inicialice en
otro valor, y se incrementan en +. En el ejemplo anterior, los identificadores son
definidos autom!ticamente en los enteros : a 5. ?tro ejemplo, donde los identificadores
tienen valores del + al A es%
enum "eporte
{#utbo$=%,&eibo$,Teni,&a'etba$$,(ata)i*n,So!t&a$$};
)os identificadores en una enumeracin deben ser Bnicos. )os nombres de las
constantes no pueden ser modificados en el programa.
/ Osando tipo enumerado /
#include <stdio.h>
enum meses {*.* " /, 3*P, 59E, 9PE, 59Q, FO.,
FOJ, 9KR, B*P, R0S, .R2, 4C0-!
main()
{
enum meses meses!
char mes.ombre68 " {((, (*nero(, (3ebrero(, (5arIo(,
A
(9bril(, (5a;o(, (Funio(, (Fulio(,
(9gosto(, (Beptiembre(, (Rctubre(,
(.oviembre(, (4iciembre(-!

'or (meses " *.*! meses <" 4C0! meses%%)
print'((,1d,//s)n(, meses, mes.ombre6meses8)!

getch()!
-
-.@ /dem!s de los tipos simples, C provee los tipos estructurados los cuales permiten
construir estructuras de datos m!s complejas. Entre ellos est!n los arreglos. )os
arreglos ocupan espacio en memoria. En la declaracin se especifica el tipo de cada
elemento y el nBmero de elementos requerido por cada arreglo. $ara declarar un arreglo
se escribe lo siguiente
#nom$re%de%tipo& #identificador&'#tama(o&)*
Un ejemplo de esta declaracin ser3a% int +,-*
Con los arreglos se pueden construir y manipular colecciones de datos del
mismo tipo como si formaran un solo objeto. Una analog3a comBn con los arreglos son
los vectores, los cuales son una coleccin de elementos del mismo tipo 'por ejemplo
Ceales( que tiene un tama0o y forman un solo objeto el vector. )a declaracin del tipo
vector ser3a
t;pede' 'loat 2ector6/778"
En esta declaracin se puede observar que el vector est! formado por +::
elementos todos reales. )a declaracin de la variable ser3a
2ector v/"
El uso de un arreglo es como el de cualquier variable, pero debemos indicar cu!l
es el elemento que queremos accesar. Esto se realiza a trav#s del +ndice del arreglo, el
cual indica la posicin del elemento a usar. )as posiciones en C, siempre empiezan en
cero ':( y terminan en la posicin <tamao> - 1. En el caso de los vectores, para
D
obtener el valor de la posicin -: y colocarlo en una variable real, se puede acer en
algunas formas equivalentes como
y=v%+%.-; i=%.;
y=v%+i-;
i=%;
y=v%+2/0i-;
2ote que en el 3ndice del arreglo 'se0alado entre corcetes( podemos colocar
una constante, una variable o una expresin, siempre que sean de tipo entero que el
subrango indicado en la definicin del arreglo.
/lgunos cuidados que debemos tener con los arreglos son%
el 3ndice no debe tomar valores fuera del subrango, por lo cual al usar variables o
expresiones dentro del 3ndice se debe acer con precaucin"
el tama0o de los arreglos est! limitado por la memoria disponible.
5.@ Una de propiedades de los tipos estructurados en C es que #stos pueden ser definidos
en funcin de otros tipos estructurados. Es as3 como, el tipo de los elementos de un
arreglo podr3a ser un arreglo. En C se simplifican estas construcciones en lo que se
denominan arreglos $idimensionales los cuales son an!logos con las matrices.
)a definicin de una matriz quedar3a
!$oat 1atri2 +%//-+%3/-;
En este caso se dice que la matriz 'arreglo bidimensional( es de tama0o +::x+>:
y sus elementos son nBmeros reales.
1espu#s de la declaracin de la variable m como Eatriz se puede usar dentro de
expresiones a trav#s de dos 3ndices, uno por cada dimensin del arreglo, como por
ejemplo
m+%/-+43- = m+%/-+4,-5m+%%-+43-;
9.@ ?tro tipo estructurado provisto por C son las estructuras o tru)t. Estos permiten
manipular elementos de tipos diferentes como si formaran un solo objeto. / estos
elementos se les denomina campos de la estructura. )as estructuras se definen usando la
siguiente instruccin%
tru)t #nom$re%del%tipo& {
#tipo& #nom$re%campo&*
,,,
#tipo& #nom$re%campo&*
} #lista de identificadores&*
$ara usar una estructura debe especificarse todo el camino donde se localiza el
campo. $or ejemplo, dada la definicin de un tipo estructura que almacene una feca
typede! tru)t #e)6a -
int d7a;
enum me {ene,!eb,mar,abr,may,8un,
F
8u$,a9o,ep,o)t,nov,di)};
int a:o;
}Tipo;!e)6a;
*e puede asignar una variable con la feca de cumplea0os de la siguiente
manera%
Tipo;#e)6a )ump$ea:o;
<<<
)ump$ea:o<d7a = /,;
)ump$ea:o<me = 8u$;
)ump$ea:o<a:o = %..,;
Como se mencion anteriormente, todo tipo estructurado puede estar definido en
funcin de otros tipos estructurados. $or ello, se pueden construir estructuras de
estructuras, arreglos de estructuras, estructuras de arreglos y as3 sucesivamente.
jercicios"
+.@ Usando tipos enumerados, arreglos y estructuras, d# definiciones de tipos para%
a( Colores primarios
b( 13as de la semana
c( 1eportes acu!ticos
d( 4ocales y consonantes
e( Cargos de profesores% instructor, asistente, asociado y titular
f( Eeses del a0o
g( .rimestre Ene@/br G9
( EayBsculas y minBsculas
i( Einor3a de Edad
jemplos de structuras"
a. 1efina un tipo de datos llamado !.C/A, con los campos adecuados
para almacenar el d3a, mes y a0o de las fecas.

typedef struct {
int dia;
int mes;
int ao;
} TFECHA;
b. 1efina un tipo de datos llamado !CD con campos adecuados para
guardar el nombre del !lbum, el cantante o grupo, la feca que lo
adquiri 'que debe ser del tipo !.C/A(, y el tipo de mBsica '$op,
CocH, etc.(.
G
typedef struct {
char Album[15];
char Cantante_Grupo[15];
char Tipo_Musica[15];
TFECHA Fecha_Ad;
} TCD;
c. 1eclare un arreglo 0isCDs de tama0o +:: de tipo !CD.
S04 5is04s6/778!
d. /signe en la primera posicin del arreglo 0isCDs, los datos
correspondientes a su !lbum musical favorito 'si no recuerda la feca en
que lo adquiri, puede poner cualquiera(
strcpy(MisCDs[0].Album,Romances);
strcpy(MisCDs[0].Cantante_Grupo,Luis Miguel);
strcpy(MisCDs[0].Tipo_Musica,Bolero);
MisCDs[0].Fecha_Ad.dia = 30;
MisCDs[0].Fecha_Ad.mes = 10;
MisCDs[0].Fecha_Ad.ao = 1996;
6unciones
+. Escriba una funcin 1orma que calcule y retorne la norma de un vector de
dimensin n. )a funcin debe recibir como par!metros el vector 'cuyos
componentes deben ser nBmeros reales( y un entero n que indique la dimensin
del mismo. Cecuerde que la norma de un vector se define como la ra3z cuadrada
de la suma de los cuadrados de sus componentes.
double .orma('loat v68, int n)
{
double Bum0uad " 7!
int i!
'or(i"7! i < n! i%%)
+:
Bum0uad %" v6i8v6i8! // 0alculo la suma de los
cuadrados
return(sqrt(Bum0uad))! // 0alculo ; retorno la raiI
cuadrada
-
-. Escriba el un procedimiento LeerDatos que recibe un vector y su dimensin, y
pide al usuario los datos para llenar las componentes del vector.
void Jeer4atos('loat v68, int n)
{
double Bum0uad " 7.7!
int i!
'or(i"7! i < n! i%%) {
print'((CntroduIca elemento ,d+ (,i)!
scan'((,'(,$v6i8)!
-
-
5. Escriba la funcin main que declare las variables necesarias, llame al
procedimiento LeerDatos con una dimensin de vector de +::, luego calcule la
norma de dico vector usando la funcin 1orma, y la imprima como resultado.
void main()
{
'loat vector6N8!
int i!
Jeer4atos(vector,N)!
print'((.orma " ,' (,.orma(vector,N))!
-
Escriba las instrucciones en C que realicen lo que se les pide, solo las instrucciones y no
el programa completo
2. 2ectores y 0atrices%
a. *ea Ciudad un arreglo de caracteres que ya a sido inicializado, escriba
las instrucciones necesarias para%
i. Imprimir el contenido del arreglo Ciudad.
print'(?,sT, 0iudad)!
ii. Imprimir el valor del s#ptimo car!cter de Ciudad
++
print'(?,cT, 0iudad6M8)!
iii. /signar la constante 3ar4uito al arreglo Ciudad
strcp;(0iudad, ?ParquitoT)!
b. *ea / una matriz de nBmeros reales de +::: x >::, la cual ya tiene
asignados valores en sus componentes. Calcule e imprima el promedio
de los elementos correspondientes a la quinta columna de la matriz
int i!
double sum " 7!
'or(i"7! i</777!i%%)
sum %" 96i86>8!
print'(Promedio " ,', sum//777.7)
c. 1eclare una matriz E de enteros de dimensiones +:: x -::, y luego
as3gnele los siguientes valores%
: + : + : + : + J
+ : + : + : + : J
: + : + : + : + J
+ : + : + : + : J
etc.
int M[100][200], i, j;
for(i=0; i <10; i++) {
if (i%2 == 0) { // Filas pares comienzan en
cero
for(j=0; j <20; j+=2) {
M[i][j]= 0;
M[i][j+1]= 1;
}
}else { // Filas impares comienzan en uno
for(j=0; j <20; j+=2) {
M[i][j]= 1;
M[i][j+1]= 0;
}
}
}
+-

Вам также может понравиться