Ejercicios del capítulo 12 Punteros

1) ¿De qué tipo es cada una de las siguientes variables?:

a) int* a,b;

a puntero, b puntero
a puntero, b entero
a entero, b puntero
a entero, b entero

b) int *a,b;

a puntero, b puntero
a puntero, b entero
a entero, b puntero
a entero, b entero

c) int *a,*b;

a puntero, b puntero
a puntero, b entero
a entero, b puntero
a entero, b entero

d) int* a,*b;

a puntero, b puntero
a puntero, b puntero doble
a entero, b puntero
a entero, b puntero doble

2) Considerando las siguientes declaraciones y sentencias:
int array[]={1,2,3,4,5,6};
int *puntero;
puntero = array;
puntero++;
*puntero=*puntero+6;
puntero=puntero+3;
puntero=puntero-puntero[-2];
int x=puntero-array;
:

a) ¿Cuál es el valor de x?

1
2
3
4

b) ¿Cual es el valor de array[1]?

2
4
6
8

3) Considerando la siguiente declaración:
struct A {
   struct {
      int x;
      int y;
   } campoB;
} *estructuraA;

a) ¿Cómo se referenciaría el campo x de la estructuraA?

estructuraA.x
estructuraA.campoB.x
estructuraA.campoB->x
estructuraA->campoB.x

Comentarios de los usuarios (2)

Julián
2013-07-26 06:18:53

Hola, me podrías aclarar algo?

Estuve tratando de resolver el cuestionario que propones sobre (Objetivo IV: Punteros 1), y me ha resultado una duda cuando realizas la siguiente operación.

 
int x=puntero-array;

que operación se está realizando. Sé que *puntero=8. Lo que pienso es que array se interpretaria como array[0] entonces seria algo como

int x = puntero-1; // ya que array[0]=1;

Pero intenté cambiar en el compilador el menos (-) por (+) me lanza un error.

Además segun la explicación que describes en la solución

//&array[1]-&array[0]=8-1  

Aqui abajo te muestro el código que pusiste, te agradecería mucho si me explicas que sucede, en especial lo del cambio de signo.

int array[]={1,2,3,4,5,6};
int *puntero;
puntero = array;
puntero++;
*puntero=*puntero+6;
puntero=puntero+3;
puntero=puntero-puntero[-2];
int x=puntero-array;
Steven R. Davidson
2013-07-26 17:07:59

Hola Julián,

En la sentencia:

int x = puntero - array;

estamos restando direcciones de memoria. Explicamos en el capítulo sobre la correspondencia entre punteros y arrays ( http://c.conclase.net/curso/index.php?cap=012e#inicio ). Básicamente, un array ES una dirección de memoria, mientras que un puntero contiene una dirección de memoria.

Como 'puntero' apunta al segundo elemento de la lista y 'array' ES la dirección de memoria del primer elemento, la resta de estas direcciones o posiciones: 2ª - 1ª = 1 de distancia.

Es normal que el compilador te lance un error al intentar sumar direcciones de memoria, porque no tiene sentido sumar posiciones. Asimismo, no tiene sentido aplicar otras operaciones aritméticas: multiplicación, división, potenciación, etcétera. Sí tiene sentido restar posiciones, porque así podemos calcular la distancia o cantidad de separación entre ambas posiciones.

Creo que el problema que estás teniendo es que confundes el concepto de una dirección de memoria con el valor que se guarda en tal dirección de memoria. Cuando escribimos:

puntero = array;

estamos asignando la dirección de memoria del primer elemento de 'array' al valor de 'puntero'. Cuando usamos el operador unitario * o el binario, [], estamos accediendo a un valor guardado en una dirección de memoria. Por ejemplo,

*puntero = *puntero + 6;

Accedemos al valor apuntado por 'puntero'. Por ejemplo, digamos que 'puntero' apunta al 5º elemento de 'array', entonces '*puntero' accede al entero, 5.

En este otro caso,

puntero = puntero - puntero[-2];

estamos accediendo al elemento en el índice -2. Esto significa que partiendo de la dirección de memoria en 'puntero', retrocedemos 2 enteros y accedemos al entero en esa dirección de memoria. Por ejemplo, si 'puntero' apunta al 6º entero en 'array', entonces 'puntero[-2]' accede al entero 4 (en el 4º lugar).

Seguidamente, restamos 4 a la dirección de memoria guarada en 'puntero', que en nuestro ejemplo, sería el 2º lugar (6º - 4 = 2º).

Espero que esto aclare las dudas.

Steven