Autor
|
Tema: A que equivale... (Leído 5,504 veces)
|
David8
Desconectado
Mensajes: 50
|
Al igual que en un puntero a puntero para acceder a casa uno de los elementos se puede usar: Tanto como Si tengo por ejemplo un puntero a una estructura tal que struct estructura *nombre; nombre = malloc(n * sizeof(*nombre)); Y un miembro de esa estructura es por ejemplo Para acceder a un elemento j de ese miembro en una estructura i uso (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 Un saludo
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Para acceder a un elemento j de ese miembro en una estructura i uso (jugador + i) -> cadena[j];
Mi pregunta es, ¿Cómo represento lo anterior como notación completa de punteros? Utilizas: *((jugador + i)->cadena + j)
Un saludo
|
|
|
En línea
|
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
|
|
|
David8
Desconectado
Mensajes: 50
|
Utilizas: *((jugador + i)->cadena + j)
Un saludo Muchas gracias  Otra pequeña duda. Cuando creo un array de punteros a char como por ejemplo: const char *palo[] = {"Corazones", "Diamantes", "Treboles", "Picas"};
el compilador me lo permite perfectamente; sin embargo cuando uso: const char **palo = {"Corazones", "Diamantes", "Treboles", "Picas"};
el compilador me lanza warnings. ¿Porqué pasa esto, si en teoría es lo mismo? Un saludo
|
|
|
En línea
|
|
|
|
Gh057
Desconectado
Mensajes: 1.190
|
hola David8, no es lo mismo... un puntero es una variable que guarda una dirección de memoria, cierto? en 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.
|
|
|
En línea
|
4 d0nd3 1r4 3l gh057? l4 r3d 3s 74n v4s74 3 1nf1n1t4...
|
|
|
David8
Desconectado
Mensajes: 50
|
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 const char *nombre[]
y lo cambio por const char **nombre
no me dice nada Un saludo
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Es que por ejemplo cuando tengo una función que recibe un parámetro que es por ejemplo const char *nombre[]
y lo cambio por 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: int fn(char *mat[100]);
Por lo anterior (N es 100, T es "char *") la declaración en realidad es: int fn(char **mat);
Un saludo
|
|
|
En línea
|
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
|
|
|
David8
Desconectado
Mensajes: 50
|
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: int fn(char *mat[100]);
Por lo anterior (N es 100, T es "char *") la declaración en realidad es: 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 vector[i].miembro;
¿cómo lo puedo representar a notación de puntero? Es que he probado con *(vector + i).miembro;
y me da error. Un saludo.
|
|
« Última modificación: 18 Mayo 2014, 12:18 pm por David8 »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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 vector[i].miembro;
¿cómo lo puedo representar a notación de puntero? Es que he probado con *(vector + i).miembro;
y me da error. Eso sucede porque el operador "." tiene mayor prioridad que "*" y esa expresión se termina evaluando así: *((vector + i).miembro);
Para que se evalué en la forma correcta debes utilizar paréntesis: (*(vector + i)).miembro;
O utilizar el operador "->": (vector + i)->miembro;
Un saludo
|
|
|
En línea
|
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
|
|
|
David8
Desconectado
Mensajes: 50
|
Eso sucede porque el operador "." tiene mayor prioridad que "*" y esa expresión se termina evaluando así: *((vector + i).miembro);
Para que se evalué en la forma correcta debes utilizar paréntesis: (*(vector + i)).miembro;
O utilizar el operador "->": (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: (*((Jugador + i) -> palo + j)) = NULL;
supongo que se estará haciendo primero (Jugador + i) -> palo
y después se le suma j. He intentado hacer (*((Jugador + i) -> (palo + j))) = NULL;
pero me da error. ¿Qué puede pasar? Un saludo.
|
|
|
En línea
|
|
|
|
ivancea96
Desconectado
Mensajes: 3.412
ASMático
|
Otra cosilla. Es que acabo de ver que el operador -> tiene mayor preferencia que + Entonces al hacer algo como esto: (*((Jugador + i) -> palo + j)) = NULL;
supongo que se estará haciendo primero (Jugador + i) -> palo
y después se le suma j. He intentado hacer (*((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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
El Supremo de EE UU ratifica que descargar música no equivale a reproducirla
Noticias
|
wolfbcn
|
0
|
1,642
|
5 Octubre 2011, 02:56 am
por wolfbcn
|
|
|
Bloquear las redes sociales equivale a mayor inseguridad
Noticias
|
wolfbcn
|
0
|
1,552
|
17 Noviembre 2011, 22:03 pm
por wolfbcn
|
|
|
Sentencia histórica a favor del P2P: una dirección IP no equivale a una persona
Noticias
|
wolfbcn
|
1
|
2,098
|
10 Abril 2012, 22:31 pm
por beholdthe
|
|
|
Mikko Hyppönen: “habilitar contenido” equivale a decir “infectar mi PC”
Noticias
|
wolfbcn
|
0
|
1,423
|
23 Mayo 2017, 21:32 pm
por wolfbcn
|
|
|
¿A qué tarjeta gráfica de PC equivale la GPU de la Xbox One X?
Noticias
|
wolfbcn
|
0
|
1,614
|
29 Diciembre 2017, 21:41 pm
por wolfbcn
|
|