Está en la página 1de 11

-Toshiba Preferred User

-Escriba el titulo aqui -1


1
Arreglos de Apuntadores
char *flecha; define un apuntador a un
caracter.
char *car[5]; define un arreglo de 5
apuntadores a caracteres.
2
struct conjunto {
int edad ;
double sueldo ;
char nombre[20] ;
} stconj ;
stconj.edad = 10 ;
stconj.sueldo = 1200.5 ;
stconj.nombre[0] = 'A' ;
Con apuntadores:
struct conjunto *pconj ;
pconj = (struct conjunto *)malloc( sizeof( struct conjunto ));
pconj->edad = 10 ;
pconj->sueldo = 1200.5 ;
pconj->nombre[0] = 'A' ;
* Los apuntadores pueden servir para el manejo
de estructuras, y su alojamiento dinmico.
*Tienen adems la propiedad de poder
direccionar a los miembros de las mismas
utilizando el operador (->) .
Apuntadores a Estructuras
-Toshiba Preferred User
-Escriba el titulo aqui -2
3
APUNTADORES COMO
PARAMETROS DE FUNCONES
Una estructura, se puede pasar a una funcin como argumento:
struct conjunto {
int edad;
double sueldo ;
char nombre[20] ;
} datos ;
void funcion( struct conjunto d);
. . .
funcion(datos);
void otra_funcion( struct conjunto *p);
otra_funcion(&datos);
4
APUNTADORES COMO
RESULTADO DE UNA FUNCON
Podemos declarar funciones que devuelven apuntadores
a un tipo de datos:
char *funcion1(char * var1 ) ;
double *funcion2(int i, double j, char *k ) ;
struct item *funcion3( struct stock *puntst ) ;
El retorno de las mismas puede inicializar apuntadores
del mismo tipo al que se devuelve o de un tipo
distinto.
void *malloc(int tamao) ;
p = (double *)malloc( 64 ) ;
-Toshiba Preferred User
-Escriba el titulo aqui -3
5
malloc() Memory Allocation
Las funciones malloc() y calloc() obtienen bloques contiguos de
memoria dinmicamente
void malloc(size_t n);
Regresa un apuntador del tipo (void *) a n bytes de almacenamiento
que no han sido inicializados, o NULL si no es posible ubicar los
bytes solicitados.
El tipo del argumento (size_t) esta definido en stdlib.h y es un tipo
unsigned
void calloc(size_t n, size_t size);
Regresa un apuntador a suficiente espacio para almacenar un arreglo
de n objetos del tamao especificado.
free(p);
Libera el especio reservado por una llamada a malloc o calloc.
6
malloc() Memory Allocation
char *cp;
cp = malloc(100);
Solicita al sistema operativo 100 bytes
consecutivos y asigna la direccin de comienzo
de este bloque a cp.
Es comn usar la funcin sizeof() para
especificar el nmero de bytes.
int *ip;
ip = (int *) malloc(100*sizeof(int));
-Toshiba Preferred User
-Escriba el titulo aqui -+
7
Estructuras de datos Dinmicas
Son estructuras que pueden variar en
cuanto a la cantidad de sus componentes
o a los tipos de datos que las componen.
NULL
NULL
NULL
8
Estructuras de datos Dinmicas
#include <stdio.h>
typedef struct mynode {
int val;
struct mynode *next;
}node;
main() {
int r1, r2, r3;
node *n1, *n2, *n3, *n4;
printf("Comienza el programa \n");
n1=(node *) malloc(sizeof(node));
n2=(node *) malloc(sizeof(node));
n3=(node *) malloc(sizeof(node));
n4=(node *) malloc(sizeof(node));
r1=initnodo(n4,8,NULL);
r1=initnodo(n3,6,n4);
r1=initnodo(n2,4,n3);
r1=initnodo(n1,2,n2);
r2 = sumanodos(n1);
printf("La suma de los valores en los nodos es =%d\n",r2);
}
int initnodo( node *thisnode, int value,
node *nextnode){
if (thisnode!=NULL) {
thisnode->val=value;
thisnode->next=nextnode;
return 0;
}
return 1;
}
int sumanodos(node *nodo1){
int suma=0,cont=0;
while (nodo1!=NULL) {
suma=suma+nodo1->val;
nodo1=nodo1->next;
}
return suma;
}
8 6
8
8 6
4
8 6 4
2
n1 n2 n3 n4
-Toshiba Preferred User
-Escriba el titulo aqui -5
76
Casting
C es uno de los pocos lenguajes que permite forzar una variable de
uno tipo para que sea de otro tipo (coercion). Esto se logra a
travs del operador cast ( ).
int num_entero;
float num_real=9.87;
num_entero=(int)num_real; /* asigna 9
a num_entero */
int num_entero=10;
float floatnumber;
floatnumber=(float)num_entero; /*floatnumber = 10.0. */
77
Casting
- Puede usarse con cualquiera de los tipos de datos
simples:
int num_entero;
char letra='A';
num_entero=(int)letra; /* asigna 65 (El codigo
ASCII de A) a numentero*/
- Algunas veces se realiza en forma automatica.
- Una buena regla es: si tiene duda, coloque el cast.
-Toshiba Preferred User
-Escriba el titulo aqui -6
78
Casting
Otro uso del cast es cuando se quiere estar seguro de que la divisin
retorna el resultado que se desea:
int num_entero, otro_entero;
....
num_real = (float) num_entero / (float) otro_entero;
/* Asegura que el resultado es real */
79
Tipos de datos enumerados
Los tipos de datos enumerados
contienen una lista de constantes que
pueden ser direccionadas como
valores enteros.
enum dias {lunes, martes, ...,
domingo} semana;
enum dias semana1, semana2;
-Toshiba Preferred User
-Escriba el titulo aqui -7
80
Tipos de datos enumerados
Se pueden definir otros valores:
enum escapes { bell = `a,backspace = `b,
tab = `t, newline = `n, vtab = `v,
return = `r};
... O forzar que el valor inicial no sea el 0 :
enum meses {ene = 1, feb, mar, ..., dic};
Est implcito que feb = 2 etc.
81
Tipos de datos enumerados
Ejemplo:
enum day {dom, lun, mar, mier, jue, vier, sab} d1, d2;
d1 = vier;
....
if (d1 == d2) ....
-Toshiba Preferred User
-Escriba el titulo aqui -8
15
Apuntadores y Funciones
Es necesario pasar como parmetro la direccin de las
variables para que stas puedan ser modificadas por la
funcin
swap(&a, &b) /* Llamada */
. . .
void swap(int *px, int *py){
int temp;
temp = *px /* contents of pointer*/
*px = *py;
*py = temp;
}
16
Apuntadores y Funciones
Cuando un arreglo se pasa a una funcin como
parametro lo que realmente se esta pasando es
la ubicacin en memoria de su primer elemento:
strlen(s) equivale strlen(&s[0])
La declaracion de la Iuncion es:
int strlen(char s[]);
Y una declaracion equivalente es :
int strlen(char *s);
porque char s[] es similar a char *s.
-Toshiba Preferred User
-Escriba el titulo aqui -9
17
Arreglos Multidimensionales y
Apuntadores
char *name[10];
char Aname[10][20];
Las instrucciones
name[3][4] y Aname[3][4] son correctas en C.
Sin embargo
Aname is un arreglo de 2D de 200 elementos.
name tiene 10 elementos que son apuntadores no
inicilizados.La ventaja es que los vectores de cada fila
pueden ser de longitudes diferentes
18
Lnea de Comandos
#include<stdio.h>
main (int argc, char **argv) {
/* programa que imprime los
argumentos de la lnea de comandos
*/
int i;
printf(argc = %d\n,argc);
for (i=0;i<argc;++i)
printf(argv[%d]:%s\n,i,argv[i]);
}
-Toshiba Preferred User
-Escriba el titulo aqui -10
19
Lnea de Comandos
Si se invoca el programa (argum) con los siguientes
argumentos:
argum f1 "f2 f3 4 stop!
La salida ser:
argc = 6
argv[0] = argum
argv[1] = f1
argv[2] = f2
argv[3] = f3
argv[4] = 4
argv[5] = stop!
Los caracteres " se ignoran.
20
Entrada/Salida
Archivos
La primera operacin sobre un archivo antes de
usarlo es abrirlo:
FILE *fopen(char *name, char *mode)
Los modos de apertura incluyen:
"r -- lectura,
"w -- escritura y
"a -- insertar al final "append.
-Toshiba Preferred User
-Escriba el titulo aqui -11
21
Entrada/Salida
Para abrir un archivo se debe declarar un (file
pointer) que apunta a una estructura del tipo FLE.
FILE *stream, *fopen();
if ((stream = fopen(myfile.dat,r)) == NULL)
{
printf(Can't open%s\n,myfile.dat);
exit(1);
}

También podría gustarte