Resolución de problemas en lenguaje C de nivel informático 2
(1) swap1(a, a+1);
Los dos parámetros de la función Voidswap1 (intc0 [], intc1 []) son dos arrays de longitud indeterminada, también Se puede considerar como dos consejos.
Mirando nuevamente el cuerpo del programa, puede ver que swap1 ha completado el intercambio de los valores c0[0] y c1[0][] señalados por los dos punteros.
Y A, a+1 son dos direcciones (es decir, punteros), que apuntan a un [0] y un [1] respectivamente (el nombre de la matriz A se define como un puntero que apunta al primer elemento de la matriz).
Cuando se ejecuta swap1(a, a+1), se copian los valores de a, a+1 (es decir, las direcciones de a[0] y a[1]) a dos punteros, a saber, C0 [] y C1 []. En este momento, C0. "swap1 ha completado el intercambio de los valores señalados por C0[] y C1[]", es decir, el intercambio de A[0] y A[1].
Entonces la matriz a se convierte en 5,3.
(2)swap 2(&b[0], &b[1]);
Dos parámetros de la función void swap2(int *c0, int *c1) Obviamente dos punteros.
Mirando nuevamente el cuerpo del programa, puede ver que swap2 ha completado el intercambio de los valores *C0 y *C1 señalados por los dos punteros.
Y & b[0], & ampB[1] son dos direcciones (es decir, punteros), que apuntan a B[0] y B[1] respectivamente.
Ejecute el intercambio 2 (&b[0], & ampB[1]), &b[0], & amp el valor de b[1] (es decir, b[0] y b[ 1] ) se copia en dos punteros, a saber, C0 y C1. En este momento, los dos punteros C0 y C1 apuntan a B [0] y B [1] respectivamente. "swap2 completa el intercambio de los valores *C0 y *C1 señalados por los dos punteros", es decir, el intercambio de B[0] y B[1].
Entonces la matriz b se convierte en 5,3.
(3) Resultado final:
La declaración Printf genera a [0], a [1], b [0] y b [1] en secuencia, y el resultado es 5353.
(4) Volver al principio
Aprender punteros no comprende la relación entre punteros y matrices, y será muy confuso en el futuro, especialmente las matrices de varios dígitos.
Las matrices son punteros:
Primero, el programa C ve Int A[10]; abrirá una sección de memoria que puede almacenar continuamente 10 datos plásticos.
Al asignar un valor a una matriz, como por ejemplo a[3] = 0;. El programa C lo reconoce como "*(a+3)=0", es decir, el valor señalado por la dirección a+3 se asigna a 0.
(¡Preste atención a los siguientes puntos!) En este momento, el almacenamiento continuo de elementos en la matriz juega un papel importante. En este momento, el programa C crea automáticamente un nuevo puntero, que apunta automáticamente a la primera dirección de esta memoria, es decir, a A [0] y especifica que el puntero apunta a los mismos datos enteros; como el elemento almacenado en la matriz.
Entonces el puntero se ha movido hacia atrás 3 unidades de datos plásticos desde que apunta a a[0], es decir, un total de * * * se ha movido 6 bytes para apuntar a a[3]. En este momento, al puntero a [3] se le asigna un valor de 0 y luego el puntero temporal desaparece automáticamente.
Printf("%s", arr) al generar una cadena (una cadena es una matriz cuyos elementos son caracteres y hay un operador nulo agregado automáticamente al final); El programa c genera cada elemento de la cadena en secuencia comenzando desde el primer elemento de la cadena arr[0] es el elemento al que apunta el puntero definido automáticamente con el valor de arr hasta que se encuentra el operador nulo.
Las matrices generales no tienen el último operador nulo, por lo que no se pueden generar como un todo, solo se pueden generar una por una. Cada salida creará un nuevo puntero temporal que apunta al elemento que se generará, completará la salida y cerrará el puntero temporal.
Los punteros son matrices:
Definir un puntero p en realidad significa encontrar una ubicación en la memoria y asignar su dirección a un puntero. Si se copia inmediatamente a una unidad de memoria posterior, como el puntero P o p+5, es posible que se cambien datos importantes en la memoria.
Por lo tanto, la gente suele dejar que el puntero recién creado apunte inmediatamente a la matriz recién definida. Esto es diferente de definir la matriz por separado porque utiliza un puntero especial en lugar de un puntero temporal.
La ventaja es que no desaparece y no tienes que empezar a moverte del array cada vez. Por ejemplo, si genera ARR [1] y ARR [2], se creará un puntero temporal cada vez, se moverá a la posición especificada, se generará y se cerrará. El puntero P puede generar arr[1] después de posicionar arr[1] una vez, y luego retroceder inmediatamente una posición para generar arr[2], ahorrando así el tiempo de crear un nuevo puntero y posicionamiento.
La desventaja es que las personas siempre deben prestar atención a la dirección del puntero. Si no tienen cuidado, pueden asignar valores incorrectos o errores de salida. Esta es también la razón por la que los principiantes suelen hacerlo. cometer errores al encontrar punteros.
No hace falta decir que, con la descripción anterior, piense en la relación entre punteros a punteros y punteros a matrices (utilizados cuando se trabaja con matrices multidimensionales).
Finalmente, los punteros y las matrices son lo mismo. La razón fundamental es que los elementos de la matriz se almacenan continuamente, lo que simplemente satisface la operación más común de los punteros: mover y luego procesar valores. La combinación de los dos puede mejorar en gran medida la velocidad de ejecución del programa y los programadores no cometerán errores si no son descuidados.