Array de punteros en lenguaje C.

Iniciado por DanielPy, 19 Diciembre 2013, 23:53 PM

0 Miembros y 2 Visitantes están viendo este tema.

DanielPy

CitarHago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-

Hola a todos.
Aclaro que hace menos de una semana que llegué al capítulo "punteros" en el libro que estoy aprendiendo  C.-
Lo que debería hacer el programa es ordenar el arreglo de punteros para que se muestre Abeja – abeja y no abeja – Abeja, el gran problema que tengo es como declarar temp para que contenga la dirección de memoria de uno de los punteros.-
Espero se entienda de lo contrario por favor consúltenme necesito esto para poder seguir.-

#include <stdio.h>
#include <string.h>

int main(void){

char *frase[] = {"abeja", "Abeja"};
int i;
i = strcmp( *frase, *(frase+1));
if(i > 0){
temp = frase;
frase = frase+1;
frase+1 = temp;
}
for(i=0; i<2; i++){
printf("%s", *(frase+i));
}


return 0;
}


Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Deberias eliminar esto:
Cita de: DanielC# en 19 Diciembre 2013, 23:53 PMHago esta aclaración porque en muchos casos suponen que tengo 15 o 20 años(es lo lógico) y en realidad tengo 61, como comprenderán no voy a la facultad y la gente que conozco no tiene la más mínima idea lo que es la computadora y menos programar.-
Ya que mientras no infrinjas las reglas de los foros no hay problema.

----

Cita de: DanielC# en 19 Diciembre 2013, 23:53 PMel gran problema que tengo es como declarar temp para que contenga la dirección de memoria de uno de los punteros
La variable temporal debe ser del mismo tipo que los elementos del array "frase": "char *".

Ademas en el intercambio debes aplicar indirección con el operador "*" o "[]". El programa con los cambios:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *frase[] = {
      "abeja",
      "Abeja"
   };
   int i;
   
   if(strcmp(*frase, *(frase + 1)) > 0){
      char *temp = frase[0];
      frase[0] = frase[1];
      frase[1] = temp;
   }
   
   for (i = 0; i < 2; i++)
      printf(" %s", frase[i]);
   putchar('\n');
   
   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

Hola rir3760.
CitarComparar dos líneas usando la función de la biblioteca estándar strcmp().
Si dos líneas están desacomodadas -- intercambiar (swap) los apuntadores (no el texto).
Discúlpame por la ignorancia, tú código cumple con el enunciado del libro?.
En cuanto a la aclaración de mi edad, obtengo mucha comprensión y no es lo mismo tener 20 que 61, son otras las posibilidades.-

Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

DanielPy

Hola a todos.-
Con esta imagen seguramente les quedara clara la idea.-



Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en 20 Diciembre 2013, 03:19 AMDiscúlpame por la ignorancia, tú código cumple con el enunciado del libro?
Si. Un ejemplo similar se encuentra en el tema Consulta argumentos.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

Hola rir3760.
Me parece que sigo sin explicarme lo suficiente, te dejo otra imagen que puede que quede más claro.-



En cuanto al enlace te soy sincero no lo probé porque es muy avanzado para mis conocimientos.-

Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Me parece que estas confundiendo la dirección de un elemento con la dirección almacenada en el elemento. Las cadenas "abeja" y "Abeja" no pueden almacenarse en las direcciones 4c69c y 4c6a0 porque cada una consta (incluyendo el '\0') de seis caracteres.

Si modificamos el programa un poco:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *frase[] = {
      "abeja",
      "Abeja"
   };
   int i;
   
   for (i = 0; i < 2; i++)
      printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);
   
   if(strcmp(*frase, *(frase + 1)) > 0){
      char *temp = frase[0];
      frase[0] = frase[1];
      frase[1] = temp;
   }
   puts("----");
   
   for (i = 0; i < 2; i++)
      printf("frase[%d]: %p --> %s\n", i, (void *) frase[i], frase[i]);

   return 0;
}


Su salida (en mi caso) es:
frase[0]: 0x004090bd --> abeja
frase[1]: 0x004090b7 --> Abeja
----
frase[0]: 0x004090b7 --> Abeja
frase[1]: 0x004090bd --> abeja


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

Hola a todos.
Por fin puedo demostrar con este programita lo que pretendía hacer, sólo que todavía no pude hacerlo con array de puntero a char, seguramente alguien me pondrá algún ejemplo.-

#include<stdio.h>

//funcion para cambiar las posiciones de memoria
void cambiar_punteros(int **x, int **y) {
void *t = *x;
*x = *y;
*y = t;
}

int main(int argc,char *argv[]){

int a1 = 15, a2 = 29, *ptr1=&a1, *ptr2=&a2;

printf("\n\n int a1 = 15, a2 = 29, *ptr1=&a1, *ptr2=&a2;");
printf("\n\n Posiciones y valores iniciales de *ptr1 --->  Valor = %d Direccion = %p",*ptr1, ptr1);
printf("\n Posiciones y valores iniciales de *ptr2 --->  Valor = %d Direccion = %p\n",*ptr2, ptr2);

printf("\n\n Ahora quiero que p1 tenga la posicion de memoria de p2 y a la inversa.\n");
cambiar_punteros(&ptr1,&ptr2);
printf("\n\n Posiciones de memoria cambiados de *ptr1 --->  Valor = %d Direccion = %p",*ptr1, ptr1);
printf("\n Posiciones de memoria cambiados de *ptr2 --->  Valor = %d Direccion = %p\n",*ptr2, ptr2);

return 0;
}


       

Saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en 24 Diciembre 2013, 00:19 AMPor fin puedo demostrar con este programita lo que pretendía hacer, sólo que todavía no pude hacerlo con array de puntero a char
Sin animo de ofender pero en este tema desde mi primera respuesta tienes un ejemplo sobre como intercambiar el valor de dos punteros (por supuesto elementos de un array):
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *frase[] = {
      "abeja",
      "Abeja"
   };
   int i;
   
   if(strcmp(*frase, *(frase + 1)) > 0){
      char *temp = frase[0];
      frase[0] = frase[1];
      frase[1] = temp;
   }
   
   for (i = 0; i < 2; i++)
      printf(" %s", frase[i]);
   putchar('\n');
   
   return 0;
}


Para que sea casi igual a tu ultimo programa solo hay que realizar algunos cambios:
#include <stdio.h>
#include <string.h>

int main(void)
{
   char *p = "abeja";
   char *q = "Abeja";
   
   if(strcmp(p, q) > 0){
      char *temp = p;
      p = q;
      q = temp;
   }
   
   printf("%s %s\n", p, q); /* Abeja abeja */
   
   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

Hola rir3760.
Me culpo por no hacerme entender desde el principio, el último programa es el que necesitaba.-



Feliz navidad para todos y saludos.
Daniel

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-