Programar en C- Arrays y Punteros
9 de septiembre de 1941 – 12 de octubre de 2011
Seguro que todos estamos de acuerdo en que quizás víspera de noche vieja y después de habernos tomados unas cervecitas, no sea el mejor momento para publicar nada, pero sirva este ejemplo simplón de excusa para recordar y rendir homenaje a quien en verdad merece ser alabado, elogiado, enaltecido, canonizado…y todos aquellos adjetivos que vengan a nuestras míseras mentes, y le llenen a uno la boca al hablar de tan ilustre personaje.
Soy consciente que al igual que yo, mucha otra gente sabrá apreciar el valor que ha supuesto tu paso por el mundo.
C FOREVER
#include -stdlib.h-
#include -stdio.h-
/*Definimos unas funciones que nos van a servir para
ilustrar los ejemplos
*/
int sumar (int a, int b)
{
return a+b;
}
void funcion_paso_por_referencia(int *px1, int *py1)
{
*px1=5;
*py1=6;
}
void poner_a_uno ( int elementos, int* vector )
{
int i;
for ( i=0; i *(vector++) = 1;
}
int main()
{
/*
Un array (se pasan por refencía)es una colección de variables
del mismo tipo a la que se accede a través de un indice y constan
de posiciones de memoria contiguas cuyo primer elemento es el 0.
La representación mas común serian las cadenas de caracteres que no
son mas que arrays unidimensionales de caracteres terminado en un nulo.
A tener cuidadin porque C no comprueba los límites de los arrays.
Un puntero (APUNTADOR) es una variable que contiene como valor una dirección
de memoria. Esa dirección marca la posición de otro objeto en memoria.
No confundir dirección de memoria con valor de la variable.
Se emplean para recorrer arrays, pasar parámetros por referencia
a las funciones, mejorar eficiencia e las rutinas...
El operador '&' devuelve la dirección de memoria
El operador '*' es el complemento de '&', devuelve el valor la variable apuntada.
A los punteros les podemos realizar las operaciones de suma y resta.
*/
char texto [4] = "abc"; //Definimos un array de caracteres = cadena.
char hola [5] = { 'h', 'o', 'l', 'a', 0 }; //Se almacenan N-1 caracteres
char holam [5]; //se guardan en posiciones contiguas de memoria
holam[0] = 'h';
holam[1] = 'o';
holam[2] = 'l';
holam[3] = 'a';
holam[4] = 0;
char holan[5]="hola";
char holas[]="hola";
/*no es necesario indicar el caracter 0, ya que el compilador lo hace
de manera automática*/
//texto alineado a la izquierda ocupando 4 caracteres
printf ( "Saludamos.... %-4s\n", hola );
//definimos un array unidimensional de numeros.
int numeros [] = {1,2,33,44,55,66,77,88,99,100};
//Podemos definir matrices de varias dimensiones
int matriz [3][8] ;
/*Las de 3 o más dimensiones no se utilizan por la
cantidad de memoria que utilizan
*/
printf ("Tamaño del Tipo int %i\n", sizeof(int));
printf ("Tamaño del array = elementos x tamaño datos %i\n", sizeof(numeros));
char *puntero = 0; /*Se recomienda inicializar los punteros al declararlos
Se usa nulo porque C garantiza la no existencia de objetos en la
dirección nula.
*/
puntero=NULL;
int valor=5;
/*Asignamos la direccion de memoria donde se encuentra el primer
elemento del array al puntero
*/
int *pvalor=&valor;
int *pnumeros=numeros;
int *pnumeros1=&numeros[0];
printf("Valor del primer elemento del array (*pnumeros): %i\n", *pnumeros);
//Buscamos el valor de la siguiente posición de memoria
printf("Valor del 2 elemento del array (*pnumeros++): %i\n", *(pnumeros+1));
//cambiamos un valor dentro la matriz
numeros[0]=11;
*(pnumeros+1)=22;
//vamos a comprobar las direcciones de memoria
printf("Misma dirección de memoria del array(posición del primer elemento)
%p y del puntero %p \n",pnumeros, &numeros);
//Calculamos el numero de elementos del Array
int numelementos=sizeof(numeros)/sizeof(int);
int i;
printf("Recorremos los elementos del ARRAY\n");
//cuidadin que tiene que ser menor porque sino nos vamos de memoria
for(i=0;i
{
printf("%i,",*(pnumeros+i));
}
printf("\nAhora pasamos la matriz como argumento y la ponemos a 1 \n");
//Pasamos un vector como parametro
poner_a_uno(numelementos,numeros);
//La volvemos a mostrar otra vez
for(i=0;i
{
printf("%i,",*(pnumeros+i));
}
//Mostramos los valores
printf("\nel valor de X=%i, y el d Y=%i ", x.x,x.y);
//PUNTEROS A FUNCIONES
/* declaramos un puntero a funciones con dos parámetros
enteros que devuelven un entero*/
int resul;
int (*funcion) (int,int);
funcion = sumar; // apunta a sumar
printf ("\nEl resultado de la suma es %i\n", funcion(1,2));
/*Por medio de punteros se puede reservar o liberar memoria dinámicamente
mediante el uso de funciones de la biblioteca stdlib.h
Para solicitar un bloque de memoria la función malloc:
void* malloc ( unsigned numero_de_bytes );
malloc devuelve un puntero inespecífico void*. No referencia a ningún
tipo de dato. Si no hay suficiente memoria libre para la asignación se
da error y devuelve un nulo.
Para Liberar la zona de memoria reservada por con malloc hacemos uso de
la funcion void: void free (void* ptr);
*/
int *ptr3; /* puntero a enteros */
// reservamos para 5 enteros y convertimos el puntero void a int
ptr3 = (int*)malloc ( 5*sizeof(int) );
*(ptr3+1) = 10;
ptr3[4] = 20;
/* liberamos la zona de memoria */
free(ptr3);
/*TENER CUIDADO CON
Un puntero a un tipo determinado puede apuntar a una variable de
cualquier otro tipo.*/
double numero=12.89;
int* puntero1;
puntero1 = № // incorrecto
/*Error de puntero no inicializado
int *pun;
*p=10; //error porque no se ha asignado posición de memoria
Error en asignacion de punteros
int i, *punt1;
i=1;
punt1=i; error porque se espera direccion de memoria
Si x e y son 2 vectores compararlos a=b no es correcto (estamos
comparando direcciones de memoria)
*/
return 0;
}
Categories: C, Programación
Dennis MacAlistair Ritchie
