Inicio > C, Programación > Programar en C- Arrays y Punteros

Programar en C- Arrays y Punteros

Viernes, 30 de diciembre de 2011 Dejar un comentario Ir a comentarios

Dennis MacAlistair Ritchie

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;

}
Enviar a un amigo: Share this page via Email
Categories: C, Programación Tags:
  1. Sin comentarios aún.
  1. Sin trackbacks aún.
*