pointer passing pass array and c++ pointers reference parameter-passing

passing - pass by reference c++



Pase por el puntero y pase por referencia (5)

Posible duplicado:
¿Cuáles son las diferencias entre la variable de puntero y la variable de referencia en C ++?
¿Hay beneficios de pasar por el puntero sobre pasar por referencia en C ++?

En ambos casos, logré el resultado. Entonces, ¿cuándo se prefiere uno sobre el otro? ¿Cuáles son las razones por las que usamos una sobre la otra?

#include <iostream> using namespace std; void swap(int* x, int* y) { int z = *x; *x=*y; *y=z; } void swap(int& x, int& y) { int z = x; x=y; y=z; } int main() { int a = 45; int b = 35; cout<<"Before Swap/n"; cout<<"a="<<a<<" b="<<b<<"/n"; swap(&a,&b); cout<<"After Swap with pass by pointer/n"; cout<<"a="<<a<<" b="<<b<<"/n"; swap(a,b); cout<<"After Swap with pass by reference/n"; cout<<"a="<<a<<" b="<<b<<"/n"; }

Salida

Before Swap a=45 b=35 After Swap with pass by pointer a=35 b=45 After Swap with pass by reference a=45 b=35


De hecho, la mayoría de los compiladores emiten el mismo código para ambas llamadas a funciones, porque las referencias generalmente se implementan usando punteros.

Siguiendo esta lógica, cuando se utiliza un argumento de tipo de referencia (no constante) en el cuerpo de la función, el código generado solo operará silenciosamente en la dirección del argumento y lo desreferenciará. Además, cuando se encuentra una llamada a dicha función, el compilador generará un código que pasa la dirección de los argumentos en lugar de copiar su valor.

Básicamente, las referencias y los indicadores no son muy diferentes desde el punto de vista de la implementación, la diferencia principal (y muy importante) está en la filosofía: una referencia es el objeto mismo, solo que con un nombre diferente.

Las referencias tienen un par de ventajas más en comparación con los punteros (por ejemplo, no pueden ser NULL , por lo que son más seguras de usar). En consecuencia, si puede usar C ++, entonces pasar por referencia generalmente se considera más elegante y debería preferirse. Sin embargo, en C, no hay referencias, por lo que si quieres escribir el código C (o, horribile dictu, código que se compila con un compilador C y C ++, aunque esa no sea una buena idea), tendrás que Restrinja el uso de punteros.


Pasar por el puntero es la única forma en que se puede pasar "por referencia" en C, por lo que aún se ve bastante usado.

El puntero NULL es una práctica convención para decir que un parámetro no se usa o no es válido, así que use un puntero en ese caso.

Las referencias no pueden actualizarse una vez que están configuradas, por lo tanto, use un puntero si alguna vez necesita reasignarlo.

Prefiere una referencia en todos los casos donde no hay una buena razón para no hacerlo. Hazlo const si puedes.


Una referencia es semánticamente la siguiente:

T& <=> *(T * const)

const T& <=> *(T const * const)

T&& <=> [no C equivalent] (C ++ 11)

Al igual que con otras respuestas, lo siguiente de C ++ FAQ es la respuesta de una línea: referencias cuando sea posible, punteros cuando sea necesario.

Una ventaja sobre los punteros es que necesita conversión explícita para pasar NULL. Sin embargo, todavía es posible. De los compiladores que he probado, ninguno emite una advertencia para lo siguiente:

int* p() { return 0; } void x(int& y) { y = 1; } int main() { x(*p()); }



Here hay un buen artículo sobre el tema: "Use referencias cuando pueda y punteros cuando sea necesario".