valor tipo referencia por paso pasar pasaje parametros parametro objetos funciones como clase argumentos c function pointers reference

paso - tipo por referencia



Pase por referencia en C (7)

(He estado usando C por un tiempo, pero todavía soy bastante nuevo para algunos conceptos en C. Estoy tratando de responder a esto según mi leal saber y entender, siéntase libre de corregirme si estoy equivocado)

Cuando dice pasar por referencia, pasa la dirección y lo hace para que use punteros apuntando a las direcciones. Entonces, debe pasar los punteros al prototipo de su función, pero lo que está haciendo es pasar la dirección directamente.

Lo que intenta su función es des-referencia (usando &) su puntero, pero nunca tuvo un puntero a los parámetros "s" e "i" para desviarlo.

La forma correcta de hacer para la función prototipo / definición es

int locate(char *name, int *s, int *i)

y cuando tiene que llamar a esta función, usa la siguiente declaración en la función principal o de llamada

int locate(char *name, &s, &i)

Estoy tratando de usar pasar por referencia en C para que la función pueda modificar los valores de los parámetros que se le pasan. Esta es la firma de la función:

int locate(char *name, int &s, int &i)

Sin embargo, cuando intento compilarlo obtengo este error que se refiere específicamente a la línea anterior:

error: esperado '';'', '','' o '')'' before ''&'' token

Si elimino el ''&'', el programa se compilará, pero no funcionará correctamente, obviamente. ¿Qué pasa aquí? ¿Cómo puedo hacer una llamada por referencia?


C no tiene referencias. Debe pasar un puntero a la variable que desea modificar:

int locate(char *name, int *s, int *i) { /* ... */ *s = 123; *i = 456; } int s = 0; int i = 0; locate("GMan", &s, &i); /* s & i have been modified */


C no tiene variables de referencia, pero puede considerar la referencia como puntero const para los datos,

Haga const puntero a datos como este para que el puntero no pueda apuntar a otros datos, pero los datos apuntados por él pueden ser cambiados.

int locate (char *name, int * const s, int * const i)


Las respuestas anteriores dadas parecen estar perdiendo contexto, y no abordan la propiedad de que los punteros C están sobrecargados. Es completamente justo afirmar que C "pasa por referencia". Un puntero es una referencia, también. Sin embargo, más formalmente, una "referencia" C es el mecanismo para representar la dirección de memoria de un símbolo.

  • Un puntero es simplemente una variable en la memoria cuyo valor se trata como una dirección.
  • Una referencia es simplemente el literal de valor para una dirección de memoria.
  • El lenguaje C permite pasar por referencia, ¡pero solo en el contexto correcto!

La separación del contexto es la definición de la firma y la invocación de la firma.

Considere las primitivas int a = 0x22e8; y en otro lugar declaramos int* b = &a; (Llegaré a las funciones en un minuto).

Podríamos visualizar esto en la memoria (supongamos que el endianismo no importa en este ejemplo):

... 0x00000200: 22e8 ; this is the variable for int a''s literal value: ; a == 0x000022e8 ; &a == 0x00000200 0x00000???: 9090 ; ... more code ... 0x00000400: 0200 ; this is pointer b pointing to a''s address: ; b == 0x00000200 ; *b == 0x000022e8 ; &b == 0x00000400 ...

Es fácil ver que podemos asignar un puntero a cualquier dirección sin trucos especiales. Un puntero es solo una variable, pero C nos permite hacer referencia a la dirección a la que apunta; podemos "desreferenciar" el puntero de su dirección de valor para tratar en cambio al puntero como el valor subyacente de su ponente durante un contexto de invocación: while ( *b == a ) ... Podríamos invocar fácilmente b == &a .

Al aplicar esto a llamadas de función, debe separar el contexto de definición de función (firma) frente a invocación para diferenciar pase por referencia.

int* foo(int* blah, int nah) { .. } // signature definition context: // These are parameters ... vs ... b = foo( &a, 4); // invocation context: // These are arguments

Al definir una firma de función, no le estamos diciendo al compilador a qué dirección se accede desde un argumento: ¡el tiempo de ejecución aún no lo sabe! No tiene sentido definir void bar(int &blah) {...} . En cambio, usamos la sintaxis del puntero desreferenciado: "cualquier argumento que se pase se cargará en la dirección apuntada a", para hacer referencia al valor del argumento deseado cuando se produce el tiempo de ejecución. Por lo tanto, C puede pasar argumentos por referencia.

Los contextos de las definiciones de firmas de funciones y las llamadas a funciones cambian la forma en que el compilador examina la sobrecarga del puntero frente a la referencia y cómo el tiempo de ejecución puede realmente abordarlos.


No puedes hacer esto en c. c no tiene referencia, puede usar puntero en su lugar.


Si desea utilizar el método de pase por referencia para modificar un parámetro utilizado en la llamada a la función, siempre use los punteros como argumentos formales de la función.

Por lo tanto, en lugar de usar esto

int locate(char *name, int &s, int &i)

utilizar,

int locate(char *name, int *s, int *i)

Cuando llame a esta función, puede usar

.........

int a=5; int d=10; char c=''A''; int result; result=locate(&c, &a, &d);

Espero que todo esté claro ahora,

Para obtener más información sobre pasar por valor o pasar por referencia y cuál es mejor, esta fuente es buena para principiantes

http://www.learnc.net/call-by-reference.php

Que te diviertas.


C no admite el pase por referencia. Necesitarás que C ++ lo haga de la forma en que está escrito, o modificar en

int locate(char *name, int *s, int *i)

y pasa los punteros a la segunda y tercera variables de parámetros.