Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: David8 en 8 Mayo 2014, 21:35 pm



Título: A que equivale...
Publicado por: David8 en 8 Mayo 2014, 21:35 pm
Al igual que en un puntero a puntero para acceder a casa uno de los elementos se puede usar:
Código:
nombre[x][y]
Tanto como
Código:
*(*(nombre + y) + x)

Si tengo por ejemplo un puntero a una estructura  tal que
Código:
struct estructura *nombre;
nombre = malloc(n * sizeof(*nombre));
Y un miembro de esa estructura es por ejemplo
Código:
char **cadena;

Para acceder a un elemento j de ese miembro en una estructura i uso
Código:
(jugador + i) -> cadena[j];

Mi pregunta es, ¿Cómo represento lo anterior como notación completa de punteros? Es decir sin usar los corchetes que uso en cadena[j] como en
Código:
*(*(nombre + y) + x)

Un saludo


Título: Re: A que equivale...
Publicado por: rir3760 en 9 Mayo 2014, 04:28 am
Para acceder a un elemento j de ese miembro en una estructura i uso
Código
  1. (jugador + i) -> cadena[j];

Mi pregunta es, ¿Cómo represento lo anterior como notación completa de punteros?
Utilizas:
Código
  1. *((jugador + i)->cadena + j)

Un saludo


Título: Re: A que equivale...
Publicado por: David8 en 9 Mayo 2014, 11:30 am
Utilizas:
Código
  1. *((jugador + i)->cadena + j)

Un saludo

Muchas gracias  :D

Otra pequeña duda. Cuando creo un array de punteros a char como por ejemplo:
Código
  1. const char *palo[] = {"Corazones", "Diamantes", "Treboles", "Picas"};
el compilador me lo permite perfectamente; sin embargo cuando uso:
Código
  1. const char **palo = {"Corazones", "Diamantes", "Treboles", "Picas"};
el compilador me lanza warnings. ¿Porqué pasa esto, si en teoría es lo mismo?

Un saludo


Título: Re: A que equivale...
Publicado por: Gh057 en 9 Mayo 2014, 13:26 pm
hola David8, no es lo mismo... un puntero es una variable que guarda una dirección de memoria, cierto?
en

Citar
    const char **palo = {"Corazones", "Diamantes", "Treboles", "Picas"};

lo que intentas hacer es guardar la dirección de memoria del puntero palo, que coincide con el arreglo... debería tirarte un warnig sobre ello... intentas definir  un "puntero a puntero" que es guardar en una variable la dirección de memoria de otra tipo puntero, cual a su vez contiene la dirección de memoria de un tipo de dato... XD

corresponde al tema de "operaciones con punteros" para que puedas profundizar el concepto.

saludos.


Título: Re: A que equivale...
Publicado por: David8 en 9 Mayo 2014, 19:22 pm
hola David8, no es lo mismo... un puntero es una variable que guarda una dirección de memoria, cierto?
en

lo que intentas hacer es guardar la dirección de memoria del puntero palo, que coincide con el arreglo... debería tirarte un warnig sobre ello... intentas definir  un "puntero a puntero" que es guardar en una variable la dirección de memoria de otra tipo puntero, cual a su vez contiene la dirección de memoria de un tipo de dato... XD

corresponde al tema de "operaciones con punteros" para que puedas profundizar el concepto.

saludos.

A vale, muchas gracias.
Es que por ejemplo cuando tengo una función que recibe un parámetro que es por ejemplo
Código
  1. const char *nombre[]
y lo cambio por
Código
  1. const char **nombre
no me dice nada

Un saludo


Título: Re: A que equivale...
Publicado por: rir3760 en 10 Mayo 2014, 03:05 am
Es que por ejemplo cuando tengo una función que recibe un parámetro que es por ejemplo
Código
  1. const char *nombre[]
y lo cambio por
Código
  1. const char **nombre
no me dice nada
En C todo se pasa por valor, cuando llamas a una función antes que el cuerpo de esta se ejecute cada uno de los parámetros (variables locales a la función) se inicializa con el argumento correspondiente (valores utilizados en la llamada).

La única excepción son los arrays, con estos cuando se llama a una función el valor que se pasa es la dirección en memoria del primer elemento, un array de tipo "T [N]" genera un valor de tipo "T *" donde T es el tipo de los elementos.

Si tu declaras una función de esta forma:
Código
  1. int fn(char *mat[100]);
Por lo anterior (N es 100, T es "char *") la declaración en realidad es:
Código
  1. int fn(char **mat);

Un saludo


Título: Re: A que equivale...
Publicado por: David8 en 18 Mayo 2014, 12:16 pm
En C todo se pasa por valor, cuando llamas a una función antes que el cuerpo de esta se ejecute cada uno de los parámetros (variables locales a la función) se inicializa con el argumento correspondiente (valores utilizados en la llamada).

La única excepción son los arrays, con estos cuando se llama a una función el valor que se pasa es la dirección en memoria del primer elemento, un array de tipo "T [N]" genera un valor de tipo "T *" donde T es el tipo de los elementos.

Si tu declaras una función de esta forma:
Código
  1. int fn(char *mat[100]);
Por lo anterior (N es 100, T es "char *") la declaración en realidad es:
Código
  1. int fn(char **mat);

Un saludo

Ya lo pillé, gracias.

Una última cosa, con relación al tema original del tema. Si en vez de tener el acceso a los miembros de la estructura con notación puntero uso por ejemplo
Código
  1. vector[i].miembro;
¿cómo lo puedo representar a notación de puntero?
Es que he probado con
Código
  1. *(vector + i).miembro;
y me da error.

Un saludo.



Título: Re: A que equivale...
Publicado por: rir3760 en 18 Mayo 2014, 17:26 pm
Una última cosa, con relación al tema original del tema. Si en vez de tener el acceso a los miembros de la estructura con notación puntero uso por ejemplo
Código
  1. vector[i].miembro;
¿cómo lo puedo representar a notación de puntero?

Es que he probado con
Código
  1. *(vector + i).miembro;
y me da error.
Eso sucede porque el operador "." tiene mayor prioridad que "*" y esa expresión se termina evaluando así:
Código
  1. *((vector + i).miembro);

Para que se evalué en la forma correcta debes utilizar paréntesis:
Código
  1. (*(vector + i)).miembro;
O utilizar el operador "->":
Código
  1. (vector + i)->miembro;

Un saludo


Título: Re: A que equivale...
Publicado por: David8 en 20 Mayo 2014, 20:33 pm
Eso sucede porque el operador "." tiene mayor prioridad que "*" y esa expresión se termina evaluando así:
Código
  1. *((vector + i).miembro);

Para que se evalué en la forma correcta debes utilizar paréntesis:
Código
  1. (*(vector + i)).miembro;
O utilizar el operador "->":
Código
  1. (vector + i)->miembro;

Un saludo

Otra cosilla. Es que acabo de ver que el operador -> tiene mayor preferencia que +
Entonces al hacer algo como esto:
Código
  1. (*((Jugador + i) -> palo + j)) = NULL;
supongo que se estará haciendo primero
Código
  1. (Jugador + i) -> palo

y después se le suma j.

He intentado hacer
Código
  1. (*((Jugador + i) -> (palo + j))) = NULL;
pero me da error.

¿Qué puede pasar?

Un saludo.


Título: Re: A que equivale...
Publicado por: ivancea96 en 20 Mayo 2014, 20:54 pm
Otra cosilla. Es que acabo de ver que el operador -> tiene mayor preferencia que +
Entonces al hacer algo como esto:
Código
  1. (*((Jugador + i) -> palo + j)) = NULL;
supongo que se estará haciendo primero
Código
  1. (Jugador + i) -> palo

y después se le suma j.

He intentado hacer
Código
  1. (*((Jugador + i) -> (palo + j))) = NULL;
pero me da error.

"palo" es un miembro de la clase, no un objeto. No le puedes sumar 'j', porque sencillamente, no es nada fuera de la clase.


Título: Re: A que equivale...
Publicado por: Gh057 en 20 Mayo 2014, 21:00 pm
hola  David8 , fíjate como estás tomando la asociación... estás intentando agrupar a
todo
Citar
((Jugador + i) -> palo + j)

a un puntero, pero j lo intentas asignar a palo? palo no lo tenías como un arreglo de chars?


Título: Re: A que equivale...
Publicado por: David8 en 20 Mayo 2014, 21:03 pm
hola  David8 , fíjate como estás tomando la asociación... estás intentando agrupar a
todo
a un puntero, pero j lo intentas asignar a palo? palo no lo tenías como un arreglo de chars?

palo es un arreglo de punteros a char

Un saludo