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.