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