2011-01-23 5 views
7

A: http://www.fredosaurus.com/notes-cpp/arrayptr/26arraysaspointers.htmlC++ - puntero de la suma y elemento de tamaño

Bajo: puntero suma y elemento de tamaño

Existe el siguiente código:

// Assume sizeof(int) is 4. 
int b[100]; // b is an array of 100 ints. 
int* p;  // p is a a pointer to an int. 
p = b;  // Assigns address of first element of b. Ie, &b[0] 
p = p + 1; // Adds 4 to p (4 == 1 * sizeof(int)). Ie, &b[1] 

Cómo hizo "p" en el la última línea se convierte en "4"?

Gracias.

+0

Tenga en cuenta que no siempre es 4. Es sólo que el más moderno El tamaño de los sistemas de 32/64 bits (int) es 4. Pero en plataformas más exóticas podría ser cualquier cosa, por lo tanto, "supongamos que sizeof (int) tiene 4" de comentario. –

+0

Sistemas no realmente esotéricos. Creo que los procesadores Arduino tienen sizeof (int) es 2 – Falmarri

Respuesta

11

(supongo que quiere decir "1" en la última línea, no "p")

Aritmética de punteros en C y C++ es una adición lógica , no un numérico adición. Agregar uno a un puntero significa "producir un puntero al objeto que viene en la memoria justo después de éste", lo que significa que el compilador automáticamente aumenta el tamaño del objeto al que apunta el incremento con el que está incrementando el puntero. Esto le impide tener un puntero en el medio de un objeto, o un puntero desalineado, o ambos.

+0

Gracias por su respuesta. Cuando dices: "lo que significa que el compilador escala automáticamente lo que sea que incrementes el puntero con el tamaño del objeto al que se apunta", ¿por qué la multiplicación por el tamaño? Cuando se agrega "1", por ejemplo, usted mencionó que esto significa escalar el puntero al objeto que viene en la memoria después de este. ¿No es esto suficiente? ¿Por qué la multiplicación por el tamaño del tipo de datos? Gracias. – Simplicity

+0

@ SWEngineer- Mis disculpas, no estaba siendo muy claro. El * puntero * no se escala. La cantidad en que se incrementa el puntero es lo que se incrementa. De esta forma, escribir 'ptr + 1' significa 'la dirección de memoria del puntero, más una vez el tamaño de los objetos apuntados'. – templatetypedef

+0

Eso está bien, no te preocupes. Gracias por tu aclaración. Algo pequeño aquí, ¿por qué crees que tenemos que multiplicar sizeof (datatype) por el número de incremento (es decir; 1)? ¿Es solo cómo se diseña C++, o hay una razón lógica aquí? Gracias. – Simplicity

3

El comentario en el código que publica lo explica: la adición de un entero x a un puntero aumenta el valor del puntero en x multiplicado por el tamaño del tipo al que apunta.

Esto es conveniente porque generalmente no tiene sentido cambiar el puntero en incrementos más pequeños; no le conviene señalar en el centro de uno de los elementos.

+0

Debe agregar que el valor "4" resultante es solo uno de una miríada de valores aleatorios que podrían haberse producido en ese ejemplo de código. En otras palabras: el valor entero que está contenido en el área de memoria donde p apunta es simplemente ... indefinido. – Frunsi

1

porque p es un puntero a un tipo con tamaño 4 bytes. + operador en punteros es en realidad puntero turno. compilador sabe el tamaño del tipo de punta y lo desplaza por el valor apropiado

si cambia int a short, p estarán desplazados en 2 bytes