Professional Documents
Culture Documents
colección finita y ordenada de datos del mismo tipo. Es la estructura natural para modelar
listas de elementos iguales.
Ejemplo: sea el siguente arreglo unidimensional donde se va a guardar 5 datos de tipo entero
(integer)
x : array[1..5] of integer
En memoria el computador guarda 5 espacios: esto quiere decir en el arreglo X en la posición 1
guarda 34, en el arreglo X en la posición 2 guarda 22, asi hasta la última posición del arreglo X
posicion 5 guarda 72.
X [1]
34
X [2]
22
X [3]
39
X [4]
63
X [5]
72
Declaracion de los arreglos unidimensionales: Se declara el tipo del arreglo, con la palabra
reservada TYPE, luego se declara la variable de tipo arreglo, esto se hace en el bloque de
declaracion de variables palabra reservada VAR.
Type
nombre_trabajador=array[1..x] of string;
Nota: El tipo de dato del arreglo puede ser: integer,real, boolean, string etc.
Var
sueldo:salarios;
nombre:nombre_trabajador;
Una vez declarados los arreglos procedemos a cargar información en ellos, para esto usamos
estructuras repetitivas la mas recomendable por su facilidad es el for, una vez cargada la
información se puede hacer cualquier operación de calculo y por último mostramos la
información de los arreglos usando de igual manera la estructura repetitiva for.
carga de un arreglo, la letra i es el indice o subindice del arreglo e indica la posición del arreglo:
begin
readln(notas[i]);
end;
begin
writeln(notas[i]:3:1);
end;
Se han hechos programas que suman una cantidad de números usando dos variables, una para
leer cada número y otra para acumular la suma. Este enfoque tiene la desventaja de que se
pierden los valores de los sumandos. El uso de arreglos permite calcular la suma de los
números con una cantidad mínima de código y a la vez conservar cada valor, como muestra el
siguiente programa completo:
Program SumaN;
Uses
Crt;
Const
n = 5;
Var
s, i: Integer;
Begin
For i:=1 To n Do
Begin
ReadLn(nums[i]);
s := s + nums[i];
End;
End.
Nótese el uso de una constante para marcar el tamaño del arreglo; dicha constante, también
sirve para controlar el For. De este modo, sólo se hace necesario cambiar un número para
adecuar el programa a la escala apropiad
PUNTEROS
Es una variable estática que, en vez de contener valores de datos, contiene valores que
representan direcciones de memoria de variables.
PUNTERO
Variable que contiene la DIRECCIÓN de memoria en la que se encuentra almacenada otra
variable.
La sintaxis general para declarar una
variable tipo puntero es:
tipo *nombre_puntero;
donde tipo es el tipo de variablesa la que apuntará el puntero.
int *p;
Asignación de punteros.
Respecto a la comparación y a la asignación, los punteros se ajustan a las mismas reglas que
cualquier otra variable en C:
•Un puntero puede utilizarse a la derecha de una declaración de
asignación para asignar su valor a otro puntero.
•Podemos comparar dos punteros en una expresión relacional.
El valor de otro puntero, del mismo tipo.
La dirección de memoriade una variable cuyo tipo coincida en el tipo_base del puntero
Inicialización de punteros
Al igual que otras variables, C no inicializa los punteros cuando se declaran y es preciso
inicializarlos antes de su uso.
TODO PUNTERO DEBE INICIALIZARSE, ya que en caso contrario
tras ser declarado apuntaría a cualquier sitio (PELIGROSO)al usarlo puede p.ej. modificar una
parte de la memoria reservada a otra variable
Si aún no sabemos dónde debe apuntar, se le asignará el valor NULL (nulo)
No apunta a ningún sitio en especial.
Ejemplo:
int *p = NULL;
APUNTADORES A ARREGLOS
Por supuesto que los apuntadores pueden apuntar a cualquier tipo de dato, incluyendo
arreglos. Mientras que eso ya era evidente cuando discutíamos el programa 3.1, es importante
expandir como es que hacemos esto cuando se trata de arreglos multidimensionales.
Para revisar, en el capítulo 2, establecimos que, dado un arreglo de enteros podemos apuntar
un puntero a entero a ese arreglo usando:
int *ptr;
ptr = &mi_arreglo[0]; /* apuntamos nuestro apuntador al primer elemento del
arreglo */
Como habíamos establecido, el tipo de la variable apuntadora debe coincidir con el tipo de el
primer elemento en el arreglo. En adición, podemos usar un puntero como un parámetro de
una función que esté diseñada para manipular un arreglo. Ejemplo:
Dados:
Algunos programadores prefieren escribir el prototipo de una función así como: void
a_func(int p[]); Lo que informaría a otros que usaran esta función que la función sirve para
manipular los elementos de un arreglo. Por supuesto, en cualquier caso, lo que realmente le
estamos pasando a la función es un puntero al primer elemento del arreglo,
independientemente de la notación usada en el prototipo o definición de la función . Nótese
que si usamos la notación de arreglos, no hay necesidad de pasar la dimensión real del arreglo,
ya que no estamos pasando el arreglo completo, sino únicamente la dirección de su primer
elemento.
Pasemos al problema de tratar con un arreglo bidimensional. Como se estableció en el último
capítulo, C interpreta un arreglo de 2 dimensiones como si se tratara de un arreglo que consta
de un arreglo de una dimensión. En ese caso, el primer elemento de un arreglo de 2
dimensiones de enteros, es un arreglo unidimensional de enteros. Y un puntero a un arreglo
de enteros de dos dimensiones debe apuntar a ese tipo de datos. Una manera de cumplir con
esto es por medio del uso de la palabra clave “typedef”. typedef asigna un nuevo nombre para
el tipo de datos especificado. Por ejemplo:
hace que el nombre byte signifique el tipo de datos unsigned char. Por tanto:
byte b[10];
Observemos cómo en la declaración del typedef, la palabra byte ha reemplazado aquello que
normalmente sería el nombre de nuestra variable unsigned char. Por tanto, la regla para usar
typedef es que el nombre del nuevo tipo de datos sea el nombre usado en la definición del
tipo de datos.
Arreglo se vuelve un nuevo tipo de datos para un arreglo de 10 enteros. Es decir Arreglo
mi_arreglo, declara mi_arreglo como un arreglo de 10 enteros y Arreglo arr2d[5]; hace que
arr2d sea un arreglo de 5 arreglos de 10 enteros cada uno.
Nótese que al hacer Arreglo *p1d; hace de p1d un apuntador a un arreglo de 10 elementos.
Debido a que *p1d apunta al mismo tipo de datos que arr2d, asignar la dirección de el arreglo
bidimensional arr2d a p1d, el puntero a arreglo unidimensional de 10 enteros, es aceptable. Es
decir, si hacemos tanto: p1d = &arr2d[0]; como p1d = arr2d; ambos son correctos.
Ya que el tipo de datos que usamos para nuestro apuntador es un arreglo de 10 enteros,
esperaríamos que al incrementar p1d por 1 cambiaría su valor por 10*sizeof(int), y lo hace.
Esto es que sizeof(*p1d) es 40. puedes comprobar esto tú mismo escribiendo un pequeño
programa.
El usar typedef hace las cosas más claras para el lector y fáciles para el programador, pero no
es realmente necesario. Lo que se necesita es una manera de declarar un puntero como p1d
sin usar la palabra clave typedef. Es posible hacerlo y que:
int (*p1d)[10];
EJERCICIOS DE ARREGLOS
//Aritmética de punteros.
#include<stdio.h>
#include<stdlib.h>
main()
int
lista[5] = {10,20,30,40,50};
int *p;
p = lista;
system("pause");
}
2.- /Programa que permite al usuario dar valores a los elementos del arreglo...
#include<stdio.h>
#include<stdlib.h>
main()
int
lista[5];
int*p;p = lista;
int i=0;
for
scanf("%d",p);
for
for
system("pause");
}
3.- #include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int main()
char letra[TAM];
char AaZ[26];
/* contadores*/
int i,j,cont;
//srand(time(NULL));
for(i=65;i<=90;i++){
AaZ[i-65]=i;
}
/*Relleno inicial del array aleatorio*/
for(i=0;i<TAM;i++){
de la letra A a Z */
letra[i]=rand()%26+65;
printf("Array inicial:\n");
escribirArray(letra,TAM);
aleatorias*/
for(i=0;i<26;i++){
cont=0;
for(j=0;j<TAM;j++){
if(AaZ[i]==letra[j]) cont++;
}
getch();
int i;
for(i=0;i<tamanio;i++){
printf("%c ",a[i]);
printf("\n");
}
EJERCICIOS DE PUNTEROS
#include <stdio.h>
int *ptr;
int main(void)
int i;
printf("\n\n");
return 0;
2.- #include<stdlib.h>
#include<stdio.h>
int main()
y = &tabla[0];
x= *y;
z = tabla;
printf("%d %d \n",*(z+i),tabla[i]);