Programación C: cómo trabajar puntero matemáticas en una matriz
¿Qué sucede cuando se incrementa un puntero en la programación de C? Diga esa variable puntero de dave referencia a una variable en la dirección de memoria 0x8000. Si es así, considere la siguiente declaración:
Dave ++ -
¿Cuál sería el valor del puntero de dave ser?
Su primer impulso podría ser decir que Dave se incrementa en 1, lo cual es correcto. Sin embargo, el resultado del cálculo puede no ser 0x8001. Eso es debido a que la dirección almacenada en una variable puntero se incrementa en uno unidad, no por un dígito.
¿Qué es un equipo?
Depende del tipo de variable. Si el puntero de dave es un puntero char, de hecho la nueva dirección podría ser 0x8001. Pero si Dave fueron un int o un flotador, la nueva dirección sería el mismo que
0x8000 + sizeof (int)
o
0x8000 + sizeof (float)
En la mayoría de los sistemas, un int es de 4 bytes, por lo que podría suponer que Dave sería igual a 0x8004 después de la operación de la subasta. Pero ¿por qué adivinar cuando se puede codificar?
Arrays y Puntero Matemáticas ilustra un programa simple, algo que podría codificar sin usar punteros: Llenar una matriz int con los valores del 1 al 10, y luego mostrar la matriz y sus valores. Pero en Arrays y el puntero Math, un puntero se utiliza para llenar la matriz.
ARREGLOS Y MATEMÁTICAS PUNTERO
#include int main () {int números [10] -INT x-int * pn pn = Números / * inicializar puntero * // * Llenar matriz * / for (x = 0-xlt; 10 x ++) {* pn = x + 1-pn ++ -} / * matriz de pantalla * / for (x = 0-xlt; 10 x ++) printf ("números [% d] =% d n", x + 1, los números [x] ) -Retorno (0) -}
Línea 7 declara el pn puntero, y la Línea 9 inicializa. los no se necesita aquí porque los números es un array, no una variable individual. En ese punto, el puntero contiene la dirección base de la matriz. Tenga en cuenta que la matriz está vacía.
El bucle for en líneas 12 a 16 se llena la matriz números. El primer elemento se llena en la línea 14 usando la notación peeker para pn puntero. Luego, en la línea 15, pn puntero se incrementa una unidad. Ahora apunta al siguiente elemento de la matriz, y se repite el bucle.
Ejercicio 1: Copie el código fuente de Arrays y puntero de Matemáticas en su editor. Genere y ejecute.
Ejercicio 2: Modificar el código fuente del Ejercicio 1 para que se muestre la dirección de cada elemento de la matriz junto con su valor.
En la salida del Ejercicio 2, debería ver que cada dirección está separado por 4 bytes (suponiendo que el tamaño de un int es de 4 bytes en la máquina). De hecho, las direcciones probablemente todos terminan en los dígitos hexadecimales 0, 4, 8, y C.
Ejercicio 3: Complete la conversión de matrices y puntero de Matemáticas, y lo que comenzó en el Ejercicio 2, haciendo que el segundo bucle for visualizar los valores de la matriz usando el lado peeker de variable de puntero pn.
Ejercicio 4: Crear un nuevo proyecto que llena una matriz de caracteres mediante el uso de punteros similares a los mostrados en matrices y Puntero Matemáticas. Ajuste el tamaño de la matriz de caracteres a 27 para que pueda sostener 26 letras. Llenar la matriz con las letras 'A' a 'Z' mediante el uso de la notación puntero. Mostrar los resultados mediante el uso de la notación de puntero.
Aquí hay una gran pista:
* pn = x + 'A'-
SOLUCIÓN AL EJERCICIO 4
#include int main () {char alfabeto [27] -INT x-char * pa-pa = alfabeto de / * inicializar puntero * // * Llenar matriz * / for (x = 0-xlt; 26 x ++) {* pa = x + 'A'-pa ++ -} pa = alfabeto - / * matriz de pantalla * / for (x = 0-xlt; 26 x ++) {putchar (* pa) -PA ++ -} putchar (' n ') - volver (0) -}
El código fuente en Solución al Ejercicio 4 debe ser bastante lúcido, la realización de cada tarea un paso a la vez. Pero hay que tener en cuenta que muchos programadores de C gusta combinar declaraciones, y tales combinaciones ocurren con frecuencia con los punteros.
Ejercicio 5: Combinar las dos declaraciones en el primer bucle de Solución al Ejercicio 4 ser sólo una declaración:
* pa ++ = x + 'A'-
Asegúrese de que la escribe correctamente. Genere y ejecute.
La salida es la misma. Lo que esto hace es fea desorden descrito aquí:
x + 'A'This parte de la declaración se ejecuta primero, sumando el valor de la variable x para letra A. El efecto neto es que el código marcha el alfabeto como el valor de x aumenta.* resultado Pathé de x + 'A' se coloca en la posición de memoria especificada por pa puntero.++El valor de la variable de pa - la dirección de memoria - se incrementa en una unidad. Debido a que el ++ aparece después de la variable, el valor se incrementa después el valor en esa dirección se lee.
Mantener los dos estados separados todavía funciona. Pero no todos los programadores hace eso! Muchos de ellos les encanta apilar hasta punteros con el operador de incremento. Cuidado con él! O, si usted lo entiende, lo utilizan.
Ejercicio 6: Repara tu código fuente del Ejercicio 5 para que el segundo bucle for utiliza el * pa ++ monstruo.
Con suerte, el * pa ++ puntero cosa tiene sentido. Si no, tomar una siesta y luego volver y examinar Head-implosión Programa.
HPROGRAMA EAD-implosión
#include int main () {char alfa = 'A'-int x-char * pa-pa = alfa / * inicializar puntero * / for (x = 0-xlt; 26 x ++) putchar ((* pa) ++) - putchar (' n') - retorno (0) -}
El código fuente del listado 19-4 ofertas con una sola variable carbón y no una matriz. Por lo tanto, la inicialización del puntero en la línea 9 requiere que el prefijo. No te olvides de eso!
Línea 12 en este código contiene el moco (* pa) ++. Es similar a * pa ++, pero definitivamente no es. A diferencia * pa ++, que se asoma a un valor y luego incrementa el puntero, el (* pa) ++ construcción incrementa un valor que se asomó AT- el puntero no se modifica.
Ejercicio 7: Editar, construir y ejecutar un nuevo programa mediante el código fuente de Head-implosión Programa.
El (* pa) ++ operación funciona, gracias a los paréntesis. El programa recupera el valor representado por * pa primero y luego ese valor se incrementa. La variable puntero, pn, no se ve afectada por la operación.
Para ayudar a evitar la confusión sobre este tema aquí son los diversos chismes notación críptica apuntador / peeker:
Expresión | Dirección p | Valor * p |
---|---|---|
* p ++ | Incrementa después de que el valor se lee | Sin cambios |
* (p ++) | Incrementa después de que el valor se lee | Sin cambios |
(* p) ++ | Sin cambios | Incrementa después de que se ha leído |
* p ++ | Incrementa antes de leer el valor | Sin cambios |
* (p ++) | Incrementa antes de leer el valor | Sin cambios |
++* p | Sin cambios | Incrementa antes de que sea leído |
++(* p) | Sin cambios | Incrementa antes de que sea leído |