tutorialspoint structur significado pointer new dogs array c++ pointers reference

c++ - structur - ¿Cuál es la diferencia entre func(int y param) y func(int*param)?



structur c++ (8)

Si mira aquí puede encontrar una descripción de Pointer vs Reference, la información más útil al principio proviene de esta cita.

C ++ no le permite declarar una "referencia constante" porque una referencia es intrínsecamente> const. En otras palabras, una vez que vincula una referencia para referirse a un objeto, no puede volver a vincularla para referirse a un objeto diferente. No hay notación para volver a vincular una referencia después de haber declarado la referencia.

Lo siguiente vincula a ri para referirse a i.

int &ri = i;

Luego una tarea como:

ri = j;

no unirá ri a j. Asignará el valor en j al objeto referenciado por ri, a saber, i.

Espero que esto sea más claro.

En el siguiente código, amp_swap() y star_swap() parecen estar haciendo lo mismo. Entonces, ¿por qué alguien preferirá usar uno sobre el otro? ¿Cuál es la notación preferida y por qué? ¿O es solo una cuestión de gusto?

#include <iostream> using namespace std; void amp_swap(int &x, int &y) { int temp = x; x = y; y = temp; } void star_swap(int *x, int *y) { int temp = *x; *x = *y; *y = temp; } int main() { int a = 10, b = 20; cout << "Using amp_swap(): " << endl; amp_swap(a, b); cout << "a = " << a << ", b = " << b << endl; cout << "Using star_swap(): " << endl; star_swap(&a, &b); cout << "a = " << a << ", b = " << b << endl; return 0; }

¡Gracias por tu tiempo!

Ver también

Diferencia entre la variable de puntero y la variable de referencia en C ++


También se puede hacer un argumento para preferir la versión del puntero sobre la versión de referencia. De hecho, desde el punto de vista de la documentación es superior porque la persona que llama es consciente del hecho de que los argumentos de entrada van a modificarse; compare estas dos llamadas:

swap(a, b); swap(&a, &b); // This cries “will modify arguments” loud and clear.

Por supuesto, en el caso de la función de swap este punto es discutible; todos saben que sus argumentos serán modificados. Hay otros casos donde esto es menos obvio. C # tiene la palabra clave ref por exactamente esta razón. En C #, lo anterior debería verse así:

swap(ref a, ref b);

Por supuesto, hay otras maneras de documentar este comportamiento. El uso de punteros es una técnica válida para hacerlo.


Las referencias no pueden ser NULL. Por lo tanto, usar la primera versión evitaría que una persona que llama pase NULL como uno de los argumentos de la función.

Las referencias no se pueden reasignar para señalar a otra cosa. Entonces, usted sabe que dentro de la función amp_swap() , eso y siempre se refieren a lo mismo. En la versión de puntero, podría (en una función más compleja) reasignar x e y para apuntar a otra cosa, lo que podría hacer que la lógica sea menos clara (sí, podría declarar los parámetros como int *const x para evitar esta reasignación).

El cuerpo de la función para la versión de referencia se ve más limpio porque no tiene tantas estrellas.



(int *param) es el estilo C más antiguo, que utiliza un puntero de memoria directa. (int &param) es el estilo moderno de C ++, que utiliza una referencia (un contenedor de seguridad de tipo alrededor del puntero sin formato). Si usa C ++, probablemente debería usar una referencia.


  • Al igual que el puntero, la referencia permite la modificación de los datos pasados ​​como un parámetro
  • Al igual que el puntero, la referencia permite el polimorfismo
  • A diferencia del puntero, la referencia nunca es NULL (aún se puede lograr esto con algún truco, pero esto es más parecido a sabotear que a codificar ...)
  • A diferencia del puntero, la referencia, cuando const, habilita la promoción de tipo (es decir, que tiene una función con un parámetro std :: string que acepta un carácter *)
  • A diferencia del puntero, la referencia no se puede reasignar: no hay forma de modificarla en algún punto del código, mientras que un puntero puede apuntar a A en un punto, B en otro y NULO en otro de nuevo. Y no desea tener ++ aplicado a su puntero por error ...
  • A diferencia del puntero, la referencia hace que la manipulación de los datos sea tan fácil como lo sería con una primitiva como "int" o "bool", sin usar el operador * todo el tiempo

Por estas razones, en C ++, el uso de referencia suele ser un valor predeterminado, y el puntero es la excepción.

Así que, por consistencia, entre las dos funciones de "intercambio" que propone, usaría amp_swap y eliminaría la estrella de las fuentes (solo para asegurarse de que nadie la usaría y agregaría un código de puntero inútil en las fuentes). .


Esto no es una cuestión de notación.

Hay 3 formas de pasar parámetros a una función:

  1. por valor
  2. por referencia
  3. por puntero

En amp_swap , pasa los parámetros reales por referencia. Esto se introduce y es válido solo en C ++.

En star_swap pasas los parámetros usando punteros. Esta fue la original C-way.

Básicamente, si está usando C ++, se recomienda usar referencia, ya que es más legible para las variables. Si necesita punteros, utilícelos.

Y recuerde usar el signo & al declarar el método con referencias, porque de lo contrario, produce un error. Si no declara la referencia en amp_swap , la función no intercambiará nada. Porque de esta manera se usa el método 1 (solo se pasan los valores de los parámetros) y en la función se crearán dos nuevas variables automáticas, que solo se encuentran en el alcance de la función. De esta forma, las variables externas originales no se tocarán.


Uno está usando una referencia, uno está usando un puntero.

Utilizaría el que tiene referencias, porque no puede pasar una referencia NULA (mientras que puede pasar un puntero NULL).

Entonces si lo haces:

star_swap(NULL, NULL);

Tu aplicación se bloqueará. Mientras que si intentas:

amp_swap(NULL, NULL); // This won''t compile

Siempre vaya con referencias a menos que tenga una buena razón para usar un puntero.

Vea este enlace: http://www.google.co.uk/search?q=references+vs+pointers