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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #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