Declaraciones en C, Ayuda, Por favor.

Iniciado por aisak77, 29 Enero 2017, 12:06 PM

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

aisak77

Según las declaraciones int *dx = &x, **ddx = &dx;
i. x es de tipo:
ii. dx es de tipo:
iii. ddx es de tipo:
iv. *dx es de tipo:
v. *ddx es de tipo:
vi. **dx es de tipo:

Dadas las siguientes declaraciones int V[4] = 1, 3, 4, 5, *p; Qué valor
contiene:
i. V + 3:
ii. p después de la asignación p = &v[0]:
iii. *(p+3):
iv. p después de la asignación p = v:
v. p+3:

ivancea96

Supongo que podrás responder a la mayoría. Hazlo, y dí qué parte del resto no sabes responder.

En cualquier caso, si no controlas aun los punteros, mira algún tutorial, comko: http://arco.esi.uclm.es/~david.villa/pensar_en_C++/vol1/ch03s04s04.html

aisak77

Según las declaraciones int *dx = &x, **ddx = &dx;
i. x es de tipo: Entero
ii. dx es de tipo: Entero
iii. ddx es de tipo: Entero
iv. *dx es de tipo: Puntero a Entero
v. *ddx es de tipo: Puntero de Entero
vi. **dx es de tipo: Puntero a Puntero a Entero

Dadas las siguientes declaraciones int V[4] = 1, 3, 4, 5, *p; Qué valor
contiene:
i. V + 3: 5
ii. p después de la asignación p = &v[0]: 1
iii. *(p+3): 5
iv. p después de la asignación p = v: 1
v. p+3: 5

Aquí expongo las posibles respuestas, os agradezco que me corrigieseis, gracias.

ivancea96

Cita de: aisak77 en 29 Enero 2017, 13:41 PM
Según las declaraciones int *dx = &x, **ddx = &dx;
i. x es de tipo: Entero
ii. dx es de tipo: Entero
iii. ddx es de tipo: Entero
iv. *dx es de tipo: Puntero a Entero
v. *ddx es de tipo: Puntero de Entero
vi. **dx es de tipo: Puntero a Puntero a Entero

Dadas las siguientes declaraciones int v[4] = 1, 3, 4, 5, *p; Qué valor
contiene:
i. V + 3: 5
ii. p después de la asignación p = &v[0]: 1
iii. *(p+3): 5
iv. p después de la asignación p = v: 1
v. p+3: 5

Aquí expongo las posibles respuestas, os agradezco que me corrigieseis, gracias.

Ahora, primera parte:
Para saber el tipo de una variable, normalmente te servirá con ver su declaración. Por ejemplo:
int *dx = &x;
No es int, es int*. Es un putnero a int, una dirección que apunta a un entero. Por esa razón se le asigna un valor con &x. x es un entero, así que &x es la dirección de un entero (int*).

Fuera de la declaración, cuando haces "*dx" no estás diciendo que es un putnero. Al revés, estamos accediendo al valor que apunta. *(int*) -> int.
Así, por ejemplo, *dx sería un entero (con el valor de x). Al poner * antes d euna variable (salvo en la declaración), digamos que "bajas" un nivel. Al poner &, "subes" un nivel. &x -> int*.
El resto te las dejo revisar :p

Y la segunda parte:
El valor de V+3 no es 5. El valor de *(V+3) SÍ es 5. Pero si no pone el *, entonces es una dirección. Es la dirección de ese 5, pero no es ese 5. *(p+3) sí que es ese 5, por ejemplo, proque tiene el *.
p = &v[0], lo mismo. No es 1, es la dirección de 1 (es decir, es igual a V): p = v es lo mismo que p = &v[0] (Poner [_] también "baja" un nivel, ya que, al fin y al cabo, es como poner un *)
*(p+3) == p[3]

Bueno, no ibas desencaminado. Solo tener cuidado con diferenciar la dirección de X con X. Y recordar que el significado de * y & en una declaración no es el mismo que fuera de ella.

aisak77

Según las declaraciones int *dx = &x, **ddx = &dx;
i. x es de tipo: Entero
ii. dx es de tipo: Puntero
iii. ddx es de tipo: Puntero a Puntero
iv. *dx es de tipo: Entero ( ¿valor de x?
v. *ddx es de tipo: Puntero
vi. **dx es de tipo: Este ya no estoy seguro.., no sé, si es una errata del ejercicio

Dadas las siguientes declaraciones int V[4] = 1, 3, 4, 5, *p; Qué valor
contiene:
i. V + 3: v[3]
ii. p después de la asignación p = &v[0]: Dirección de memoria del primer elemento del vector. "v"
iii. *(p+3): 5
iv. p después de la asignación p = v: DIreccion de memoria del primer elemento del vector. "v"
v. p+3: v[3]

Muchas graccias por tu ayuda ivan, tengo un examen el miercoles, y quiero que estos conceptos me queden bien claros, aunque aún hay algunos que no los consigo comprender bien, aquí te dejo las respuestas según he entendido lo que me has explicado, gracias de nuevo.

ivancea96

Bien, solo 2 detalles:

Citariv. *dx es de tipo: Entero ( ¿valor de x? )


Citarvi. **dx es de tipo: Este ya no estoy seguro.., no sé, si es una errata del ejercicio
No es error. **dx es el valor de x.
dx apunta a x. ddx apunta a dx. Por tanto, al poner *ddx, estás dirigiendote a la variable dx. Al poner otro *, estás dirigiendote a lo que apunta la variable dx.
**ddx es lo mismo que poner *(*ddx). *ddx es dx, así que eso "se convierte" en *(dx).

Citari. V + 3: v[3]
Citarv. p+3: v[3]
dirección del cuarto elemento del vector, no v[3]. v[3] no es la dirección del cuarto elemento, ES el cuarto elemento.
Lo mismo para la otra.

MAFUS

Tiene razón, **dx es una errata, seguramente el ejercicio quería decir **ddx.

ivancea96


aisak77

Resumiendo, quedaría tal que así:

Según las declaraciones int *dx = &x, **ddx = &dx;
i. x es de tipo:Entero
ii. dx es de tipo:Puntero
iii. ddx es de tipo:Puntero a Puntero
iv. *dx es de tipo:Entero
v. *ddx es de tipo:Puntero
vi. **dx es de tipo:Entero

Dadas las siguientes declaraciones int V[4] = 1, 3, 4, 5, *p; Qué valor
contiene:
i. V + 3:Dirección de memoria del cuarto elemento del vector.
ii. p después de la asignación p = &v[0]:Dirección de memoria de la primera posición del vector
iii. *(p+3):5
iv. p después de la asignación p = v:Dirección de memoria de la primera posición del vector
v. p+3:Dirección de memoria del cuarto elemento del vector.

Muchas gracias, Un saludo.