2011-03-28 12 views
12

Tengo problemas con una pregunta de examen pasado sobre los punteros en C y que encontré de este enlace, http://www.cl.cam.ac.uk/teaching/exams/pastpapers/y2007p3q4.pdfpuntero Difícil pregunta

La pregunta es la siguiente:

AC programador está trabajando con una máquina little-endian con 8 bits en un byte y 4 bytes en una palabra. El compilador admite el acceso no alineado y usa 1, 2 y 4 bytes para almacenar caracteres, cortos e int respectivamente. El programador escribe los siguientes de fi niciones (abajo a la derecha) para acceder a valores en la memoria principal (abajo a la izquierda):

Dirección Offset de byte
--------- 0 --1-- 2-- 3
0x04 | 10 00 00 00
0x08 | 61 72 62 33
0x0c | 33 00 00 00
0x10 | 78 0c 00 00
0x14 | 08 00 00 00
0x18 | 01 00 4c 03
0x1c | 18 00 00 00

int **i=(int **)0x04; 
short **pps=(short **)0x1c; 

struct i2c { 
int i; 
char *c; 
}*p=(struct i2c*)0x10; 

(a) Anote los valores de las siguientes expresiones C:

**i 
p->c[2] 
&(*pps)[1] 
++p->i 

consigo

**i == 0xc78 
p->c[2] == '62' 
++p->i == 0x1000000 

No entiendo la tercera pregunta (&(*pps)[1]), ¿alguien podría explicar lo que está pasando aquí? Entiendo que el puntero pps ha sido desreferenciado pero luego la dirección del operador se ha aplicado al valor. No es como pedir la dirección de una constante, por ejemplo, si lo hice

int i = 7; 
int *p = &i; 
&(*p) //would this mean address of 7?? 

Gracias de antemano por cualquier ayuda.

+2

¿Por qué demonios preguntan estas cosas en lugar de enseñar programación útil y limpia? – slezica

+0

Me alegra que alguien más lo piense así también. También me gustaría agradecer a todos por su esfuerzo en dar respuestas rápidas y concisas. Para mí es mucho más claro. –

Respuesta

7

El operador [] tiene prioridad sobre el operador &. Por lo tanto, el código desreferencia pps para llegar al primer elemento de una matriz de short*. Como este elemento también es un puntero, podemos tratarlo como una matriz y buscar el elemento una posición a la derecha de lo que apunta, con [1]. Finalmente, tomamos la dirección de ese elemento.

Podría ser útil tener en cuenta que &p[i] es lo mismo que p + i - le da un puntero al elemento i posiciones a la derecha de donde p puntos a.

Los valores intermedios son:

pps == 0x1c 
*pps == 0x18 
&(*pps)[1] == *pps + 1 == 0x1A 

(la +1 añade dos bytes, ya que se utiliza en un short*)

+3

¿Podría la persona que me votó negativamente señalar mi error (s) para poder corregirlo? –

+0

(A falta de eso, ¿alguien más puede detectar algún error?) –

+0

+1 durante unos 20 minutos Pensé que estaba totalmente equivocado (aunque no votó negativamente de todos modos) pero sus valores me parecen bien – MByD

1

La expresión se analiza como &((*pps)[1]); pps se está tratando como un puntero a una matriz, está accediendo al primer elemento de esa matriz apuntada, y luego tomando la dirección de ese elemento.

0

pps es un puntero a un puntero. Está desreferenciando pps. Entonces ahora tienes un puntero. Como las matrices son solo punteros, entonces está usando pps como una matriz.

es entonces igual a:

short ps[2] = {0x0001,0x034c}; 
short **pps = &ps; 

lo que el resultado es: 0x034c

+1

No: '(* pps) [1]' es 0x034c. '& (* pps) [1]' es 0x1a. –

+0

Sí, a la derecha, la dirección del puntero es 0x1a. (habilidades de comprensión que faltan a las 23:30) :) – PAntoine

1

pps es un puntero a puntero a corto,

que significa que *pps es un puntero a corto (o matriz de pantalones cortos),

(*pps)[1] es como *(*pps + 1) [punteros aritmética],

y &(*(*pps + 1)) es la dirección de *(*pps+1),

o, en otras palabras - (*pps+1) (que es un puntero a corto).