Professional Documents
Culture Documents
DEPARTAMENTO DE ELECTRONICA
ELO311 Estructuras de Computadores
C
Contenidos
1.- Características del lenguaje
2.- Modelo de Máquina
3.- Declaraciones
4.- Punteros
5.- Expresiones
6.- Estructura de Acciones
Características
• Portabilidad
• Reemplaza Assembler
• Compilación Eficiente
• Bibliotecas
• Control de Flujo estructurado
• Conjunto amplio de operadores
• Punteros. Aritmética de direcciones
• Funciones. Paso por valor
• Arreglos y Punteros
• Tipos simples
• Capacidad de crear Estructuras de Datos
• Clases de Almacenamiento
• Preprocesador
Compilación (Ambiente)
Compilación Separada
main(...)
cc -c m2.c
Sintaxis
Se emplean los siguientes metasímbolos:
* indica la repetición de una o más veces.
[ ] indica que el elemento es opcional.
| indica elementos alternativos.
Programa :
/* comentario */
#include <archivo estándar>
#include “archivo local”
#define IDENTIFICADOR constante
definición de datos *
función *
Definición de datos :
Función :
• Acciones
acción:
expresión ;
acción nula:
;
acción rotulada:
rótulo : acción ;
bloque:
{
acción *
}
alternativa:
if (expresión)
acción1
[ else
acción2 ] /*expresión = 0 se efectúa acción 2*/
alternativas mutuamente excluyentes:
if (e1)
a1
else if (e2)
a2
else if (e3)
a3
else
a4
switch:
switch (exp)
{
case const1:
acción *
break;
.
.
default :
acción *
break;
}
Iteración:
while (expresión )
acción *
Lazo For:
for (inicio; condición; reinicio) bloque
inicio;
while (condición) {
bloque;
reinicio;
}
Repetición:
do
bloque
while (exp);
Control:
continue;
break;
goto rótulo;
return;
Retorno:
return (expresión);
• Expresiones
Llamado a función:
función ( [ exp [, exp ] * ] )
• Operadores :
Expresión <op. Diádico> expresión
<op. Monádico> expresión /*prefix */
expresión <op. Monádico> /*postfix */
Asociatividad
Ejemplo:
X*Y*Z es equivalente a (( X * Y ) * Z )
Operadores Aritméticos
X+Y
X-Y
X*Y
X/Y
X%Y Módulo
Operadores Monádicos
-X Negativo
X++ Toma valor de X y después incrementa a X.
X-- Toma valor de X y después decrementa a X.
++X Incrementa a X y después toma valor de X.
--X Decrementa a X y después toma valor de X.
Nota : X debe ser un lvalue. (left-value indica una variable en la cual se puede
almacenar información; por ejemplo, x+1 no es un l-value.)
Operador de Asignación
X op = Y Equivalente a X = X op Y
op puede ser + , - , * , / , %, | , ^ , & , >> ,<<.
Nota : X debe ser un lvalue.
Jerarquía de Tipos
double ← float
Ç
long
Ç
unsigned
Ç
int ← char, short
Ç conversión automática (implícita).
Operaciones Relacionales:
Valor 1 si la expresión es verdadera.
X>Y
X<Y
X>=Y
X<=Y
X==Y Iguales
X!=Y Diferentes
Condicional:
X?Y:Z X ≠ 0 ⇒ Y; X=0⇒ Z
Secuencia:
X,Y Asegura ejecutar primero X, luego Y.
( tipo ) X
Modelo de Memoria
ejec.out
Código
PC (text) Funciones
Datos Externas
Variables
iniciada con valores
Estáticas
iniciada en cero
Dinámica
SP Argumentos Variables
automáticas
FP Variables Locales
Stack
internas
Registros
espacio de f1
f1(x,y)
int x,y;
m a
f.p. {
d.r. char m='a';
.
.
x 3 f2(1,2,3);
.
y 6 .
}
espacio del main
V2 2 f2(a,b,c)
V1 4 int a,b,c;
f.p. {
.
dir. retorno .
}
a 0 f1
1
arreglo
funciones
n-1 f2
s
string
0 \0
e
estructura
u
unión
p
puntero
Los nombres de las funciones y de las estructuras: arreglos, struct, string, union son
punteros.
Alcance y visibilidad
En m1.c se define x En m2.c se declara x
m1.c m2.c
int x; /*definición*/ extern int x; /*declaración*/
f1(); f3();
{ {
.... int x;
} ...
int y; }
f2()
{
int z:
...
}
Declaraciones.
{
Alcance
Identificador Declaración Clase Almacenamiento
Tipo
Punteros
Variable que contiene la dirección de un objeto.
Definición :
x variable de tipo T
T x;
p
T *p;
Operadores :
&x dirección de x
*p indirección. Objeto apuntado por p
Fijar Puntero :
p x
p=&x
Declaraciones Recursivas
Ejemplo Declaraciones :
int x;
int *pi;
int **ppi;
pi x
pi = &x 5
ppi
ppi =&pi
*pi = 5;
**ppi = 5;
Declaraciones Recursivas :
int *fpi(); función que retorna puntero a entero
int (*pfi)(); puntero a función que retorna int
int *(*pfpi)(); puntero a función que retorna puntero a entero
Declaraciones Abstractas :
char *pc;
float *pf;
int *(*pfpi)( );
Cast :
pf=(float *) pc;
pc=(char *) pf;
pfpi=(int *(*)( ))pc; /*algunas son difíciles de interpretar*/
int x; /* definición */
char c;
f1(...)
{
out x
f
1
x = ...;
...
in x
f
1
= .... + x ;
}
f2(...)
...
{ extern int x; /* declaración */
x =... ;
}
Comunicación vía variables externas
f2 f1
a[9]
Arreglos de Caracteres
int f(char s[ ])
/*declaración tamaño desconocido*/
{
int i = 0;
while (s[i]!= '\0') i++;
return(i);
}
/*ejemplo invocación*/
largo = f(línea);
Arreglos y Punteros
El nombre de un arreglo es un puntero.
char a[100];
char *pa=a;
pa a
Arreglos y Punteros
Contenidos Direcciones
Arreglos Punteros
Aritmética de Punteros
a) puntero + entero
Si pa = a , entonces
pa + i es la dirección de a[i]
- b1). Compararse
p<q p>=q p!=q p==q
- b2). Restarse
0
1 q
2
. p
.
p-q es el número de componentes entre p y q .
Considerando que el único carácter que toma valor cero(falso) es el nulo, puede
modificarse el diseño según:
char *pl2(char *p) /* puntero al último carácter de un string */
{ while (*p) p++; return (--p); }
Matrices
int m[2][4];
2x4
Se almacenan por renglones :
m[0][0]
m[0][3]
m[1][0]
m[1][3]
(paréntesis obligatorio:
[ ] tiene mayor precedencia que *.
Arreglo de punteros
Definición:
to *ap[n];
ap
0
1
objetos de tipo to
n-1
Notación:
ap[i] es puntero a objeto tipo to
*ap[i] es el objeto de tipo to
Declaración:
f(to *s[ ])
{
.....
}
Ej. Ver : Iniciación de arreglo estático K.R. 5.9
Uso en tablas de string de largo variable
Entonces en la definición de g :
g(int (*fp)() )
/* *fp es la función. */
{... /* fp es el puntero a una */
/* función que retorna entero */
(*fp)(...); /* (*fp)(...) es el llamado a la */
/* función con argumentos ... */
...
}
Cuando se use : Se llama a f y luego se aplica indirección, a través del puntero, para
obtener el entero.
pp
a 0 1 2 3 4
pp
a 0 1 2 3 4
Respuesta :
pp apunta a p[1]; su valor es p+1. Por lo tanto: pp-p=(p+1)-p=1
*pp dirección de a[1]; su valor es a +1. Por lo tanto *pp-a = (a+1)-a =1
**pp es el contenido de a[1]; es 1
Ejemplo : Continuación
pp pp
p p
*pp++
a 0 1 2 3 4 a 0 1 2 3 4
es *(pp++)
pp
p
es ++(*pp)
a 0 1 2 3 4
Tipos Estructurados
Declaración o molde:
nombre del objeto
struct colección {
tipo1 miembro1;
tipo2 miembro2;
..
} ;
Definición:
Observaciones:
- No se puede tomar dirección de los miembros (no hay punteros a los miembros; si
a la estructura)
- Pueden ser recursivas
- Pueden anidarse estructuras
- Se puede pasar (o sacar) estructuras de funciones (En C de K.R. no se puede y
deben pasarse (o escribirse) punteros)
- Se puede asignar o copiar una estructura como unidad. (En Ansi C. No en C de
K.R.)
- En C++ el concepto está refinado aún más, y es el modelo del objeto.
Ejemplo:
struct nodo {
char palabra[20];
int cuenta;
struct nodo *izq;
struct nodo *izq;
};
struct nodo s, *sp;
nodo
palabra
cuenta
Manipulación
En la definición de la función:
f(struct nodo *p)
{
....
}
Operadores y Significados
Con :
struct { p x y
int x;
int *y;
} *p;
Fields: Campos en C
Se empaquetan varios objetos en una palabra de memoria.
a) Implementación con operadores al bit.
Ver K.R. 6.7 se definen máscaras para posiciones
b) Con estructuras
Se definen un conjunto adyacente de bits, dentro de un entero.(se especifica
el ancho en bits)
struct {
unsigned is_keyword:1;
unsigned is_extern:1;
}
c) La unión es importante en compiladores cruzados, a través de ella puede mapearse
los registros y bits de un microprocesador.
Observaciones:
- Dependen de la implementación (hardware)
- Pueden tenerse campos sin nombre (para relleno)
- La suma de largos de campos, no debe exceder el largo del entero. (en caso de
hacerlo, los campos siempre se alinean)
palabra
Si se tiene:
Queda:
se pierde espacio
- Se manipulan como estructuras
Unión
Variable que en diferentes tiempos almacena objetos de diferente tipo.
Espacio reservado es el del tipo que ocupe más espacio.
Es responsabilidad del programador, el tipo de dato que está corrientemente
almacenado.
Ejemplo: union u{
int i;
float f;
char *p;
} x;
Ejemplo: si se sabe que el entero es alinado con una palabra; entonces h estará
siempre alineado correctamente con:
union h{ tipocomplejo c;
int x;
}
Typedef