Ejemplo de paso de parámetro de puntero C / c ++

Soy un estudiante de segundo año. He estado aprendiendo programación durante un año. Me gustaría compartir la tecnología con ustedes en forma de blog. Si hay algo mal en mí, les doy la bienvenida a todos para que me corrijan.
Hoy, uno de mis estudiantes de último año me preguntó sobre el cambio del valor de paso del puntero. Decidí compartir la pregunta que me hizo mi hermano hoy con ustedes en código.

Deja de decir tonterías, vayamos al código.
1) En el primer caso, el parámetro de función es un puntero y el valor se asigna de esta manera

prueba nula (int * arr) { int a = 3;

arr = &a;

}

int main (void) {

int value = 0;
int *arr = &value;

printf("函数调用前:*arr=%d\n",*arr);
//test(arr);
printf("函数调用后:*arr=%d\n",*arr);


system("pause");
return 0;
}
大家觉得这个value传入前后值是否会改变,答案当然是不会改变!
好让我们看看在vs2010上的执行情况

!Inserte la descripción de la imagen aquí

2) Aquí notamos que el puntero de parámetro en la función test () es un nuevo puntero creado en la función temporal. De esta manera, somos equivalentes a la asignación del puntero, es decir, el puntero arr en la función de prueba = el arr puntero en la función principal, después de la asignación, la operación de asignación se realiza en él, de hecho, la operación de asignación ya se realizó en este puntero temporal y no tiene nada que ver con el puntero de función principal original.
Entonces, si queremos cambiar el valor entrante pasando parámetros, podemos usar este método.
Simplemente agregue un carácter de dirección y el resultado será muy diferente.

prueba nula (int * & arr) { int a = 3; arr = & a;

}

int main (void) {

int value = 0;
int *arr = &value;

printf("函数调用前:*arr=%d\n",*arr);
//test(arr);
printf("函数调用后:*arr=%d\n",*arr);
system("pause");
return 0;
}

Inserte la descripción de la imagen aquí

3) Hemos visto que el valor de arr ha cambiado. Porque el parámetro en la función test () ya no es una copia de la función principal en este momento. Ambos son equivalentes.
De hecho, hay otra forma de jugar: puedes cambiar
el valor de arr sin agregar referencias y también puedes cambiar el valor del valor
void test (int * arr) { int a = 3;

*arr = a;

}

int main (void) {

int value = 0;
int *arr = &value;

printf("函数调用前:*arr=%d\n",*arr);
printf("函数调用后:*value=%d\n\n",value);
test(arr);
printf("函数调用后:*arr=%d\n",*arr);

printf("函数调用后:*value=%d\n",value);

system("pause");
return 0;
}
我们看下在vs2010的执行情况

Inserte la descripción de la imagen aquí

El arr de la subfunción aquí también es una copia de la función principal, pero por qué puede cambiar el valor de arr y cambiar el valor de value, es porque en la subfunción * arr = a ; ¡Realmente opere directamente sobre el valor del valor!
Eso es todo por el intercambio de punteros de hoy. Si tiene alguna pregunta, puede comunicarse conmigo.

Supongo que te gusta

Origin blog.csdn.net/weixin_45825875/article/details/108412033
Recomendado
Clasificación