¿Está pasando el argumento del puntero, pasa por el valor en C ++?

¿Está pasando el argumento del puntero, pasa por el valor en C ++? Como veo que cualquier cambio en el puntero como tal no se refleja fuera del método. Sin embargo, se reflejan los cambios que hago desreferenciando el puntero.

En ese caso, ¿es aceptable / procedimiento estándar usar puntero a puntero como argumento para una función para modificar el valor del puntero como tal dentro de una función?

Sí a ambos.

Los indicadores se transmiten por valor como cualquier otra cosa. Eso significa que el contenido de la variable de puntero (la dirección del objeto apuntado) se copia. Eso significa que si cambia el valor del puntero en el cuerpo de la función, ese cambio no se reflejará en el puntero externo que aún apuntará al objeto viejo. Pero puede cambiar el valor del objeto al que apunta.

Si desea reflejar los cambios realizados en el puntero al puntero externo (hacer que apunte a otra cosa), necesita dos niveles de direccionamiento indirecto (puntero a puntero). Cuando llamas a funciones, lo haces poniendo un & antes del nombre del puntero. Es la forma estándar C de hacer las cosas.

Cuando se utiliza C ++, se prefiere usar referencias en vez de puntero (en adelante, también puntero a puntero).

Para el por qué las referencias deben preferirse a los punteros, hay varias razones:

  • las referencias introducen menos ruido sintáctico que los punteros en el cuerpo de la función
  • las referencias guardan más información que punteros, que pueden ser útiles para el comstackdor

Los inconvenientes de las referencias son en su mayoría:

  • rompen la simple regla de paso por valor de C, lo que hace menos comprensible la comprensión del comportamiento de una función con respecto a los parámetros (¿serán cambiados?). También necesita un prototipo de función para estar seguro. Pero eso no es realmente peor que los niveles de múltiples punteros necesarios al usar C.
  • no son compatibles con C, eso puede ser un problema cuando se escribe código que debería funcionar con los progtwigs C y C ++ (pero ese no es el caso más habitual).

En el caso específico de puntero a puntero, la diferencia es principalmente simplicidad, pero al usar referencia también puede ser fácil eliminar ambos niveles de punteros y pasar solo una referencia en lugar de un puntero a puntero.

Entiendo la confusión aquí. Los conceptos de “pasar por valor” y “pasar por referencia” no son tan claros, incluso si parecen ser así. Tenga en cuenta que la computadora no conoce estos conceptos y no se comporta de acuerdo con ella. La computadora no sabe sobre los tipos. Por lo tanto, no hace una distinción de punteros y valores. Déjame intentar explicar por ejemplo:

 void func1(int x) { x = 5; } void func2(int *x) { int a; x = &a; } 

La operación es la misma para la máquina en ambas funciones: obtiene el argumento y lo cambia. Tenga en cuenta que, en la segunda función no modifica * x, modifica x .

Ahora si llamamos a estas funciones,

 int y = 10; func1(y); //value of y does not change func2(&y); //value of &y does not change, but the value of the address which y points may change. 

Prefiero decir que, básicamente, cada llamada de función es “llamada por valor” . Pero en el caso de un tipo de puntero, tenemos una forma de cambiar el contenido de otra dirección en la memoria.

Si hubiéramos escrito func2 como

 void func2(int *x) { *x = 5; } 

Entonces, este sería un caso real de “llamada por referencia”.

O bien, un puntero a un puntero, o una referencia a un puntero, es lo que usaría si quisiera cambiar potencialmente el puntero. Para su pregunta original, técnicamente, sí, todos los parámetros se pasan por valor.

Sí lo es, como está en C.

En ese caso, ¿es aceptable / procedimiento estándar usar puntero a puntero como argumento para una función para modificar el valor del puntero como tal dentro de una función?

¿En ese caso? ¿Qué deseas? Puede usar referencias reales con el & modificador.

 void func(type &ref);