2010-09-26 18 views
20

Estoy un poco confundido sobre cómo funcionan los punteros.C++ Pase el puntero a la función (Cómo) + Manipulación del puntero C++

Digamos que tengo la siguiente función y el puntero, y ...

EDITAR:

... Quiero usar un puntero a un objeto como un argumento de la función.

es decir .:

void Fun(int Pointer){ 
    int Fun_Ptr = ---Passed Pointer---; 
    //So that Fun_Ptr points to whatever ---Passed Pointer points to 

Entre el * Puntero y & notaciones Pointer, estoy muy confundido. Sé que * Pointer significa dar lo que apunte.

Pongo void (int * pointer) en la declaración. ¿Qué pasa cuando uso la función?

Su ayuda es apreciada.

EDIT 2:

Vale, ahora entiendo que el uso de * variable en una declaración significa que se le pasará un puntero. Sin embargo, ¿qué pasa cuando uso la función?

es decir

int main(){ 
    int foo; 
    int *bar; 
    bar = foo; 
    Fun(bar); 
} 

Datos 3: bien, así que me corrija si estoy equivocado:

De acuerdo con las convenciones del código anterior:

bar = & medios foo : Hacer punto de barra a foo en la memoria

* bar = foo significa Cambiar t l valor que los puntos de barras para igualar lo foo es igual

Si tengo un segundo indicador (int * uf), entonces:

bar = uf significa: puntos de barras para el puntero uf

bar = * uf significa: puntos de barras al valor que los puntos oof, pero no a la propia puntero uf

* bar = * uf significa: cambiar el valor que los puntos de barras para que el valor que los puntos de oof a

& bar = & oof significa: cambiar la dirección de la memoria que la barra apunta a ser la misma que la dirección de memoria que contiene

¿Tengo este derecho?

EDIT 4: Muchas gracias por toda su ayuda (ojalá pudiera aceptar más de 1 respuesta, pero tengo que ir con la primera. No estoy seguro de cómo funciona exactamente una wiki de la comunidad, pero me iré de esta manera para la edición (no dude en convertirlo en una guía de referencia si lo desea).

+0

Su segunda edición es casi correcta, sin embargo, – Tomas

+0

"¿Es correcto?". No. No quiere que 'bar' sea * igual * a' foo', quiere que * apunte a * 'foo'. Esto se hace con el operador de dirección. 'bar = &foo;'. –

+0

bar = foo, no es válido, ya que foo es un int y barra un puntero. El código correcto es "bar = & foo" porque como un puntero, la barra solo puede almacenar direcciones de memoria, no un int. Perdón por las respuestas del comentario. – Tomas

Respuesta

39

Hay una diferencia en el uso de * cuando se está definiendo una variable y cuando usted lo está utilizando.

En declaración,

int *myVariable; 

significa un puntero a un tipo de datos entero. En el uso, sin embargo,

*myVariable = 3; 

Medios deferencia el puntero y crea la estructura que está apuntando a igual a tres, en lugar de tomar el puntero igual a la dirección de memoria 0 x 0003.

Así que en su función, quiere hacer esto:

void makePointerEqualSomething(int* pInteger) 
{ 
    *pInteger = 7; 
} 

en la declaración de la función, * significa que está pasando un puntero, pero en su cuerpo de código real * significa que se está accediendo a lo que el puntero está apuntando.

En un intento de onda de distancia cualquier confusión que tiene, voy a ir brevemente en el símbolo de unión (&)

& medios Dirección de algo, su ubicación exacta en la memoria de los ordenadores, por lo

int & myVariable; 

En una declaración se entiende la dirección de un entero o un puntero.

Sin embargo, esto

int someData;  
pInteger = &someData; 

Medios hacer el propio puntero pInteger (recuerda, los punteros son sólo las direcciones de memoria de lo que apuntan a) igual a la dirección de 'somedata' - por lo que ahora pInteger apuntará a alguna de datos , y se puede usar para acceder a él cuando lo deferencia:

*pInteger += 9000; 

¿Tiene esto sentido para usted? ¿Hay algo más que encuentres confuso?

@ Edit3:

Casi correcta, a excepción de tres declaraciones

bar = *oof; 

significa que el puntero del bar es igual a un número entero, no lo barra de puntos en los que no es válido.

&bar = &oof;

El signo es como una función, una vez que se devuelve una dirección de memoria no se puede modificar de donde vino. Al igual que este código:

returnThisInt("72") = 86; 

No es válido, por lo que es el suyo.

Por último,

bar = oof 

no significa que "bar puntos al puntero oof" Esto significa que las barras apunta a la dirección que los puntos oof a, por lo que los puntos de barras a lo foo está apuntando a - no impide apunta a foo que apunta a oof.

+0

Bien, ¿eso significa que el puntero pInteger apunta al puntero someData? – Biosci3c

+1

Debería haber aclarado, someData no es un puntero, es un int en bruto. He editado mi respuesta de manera apropiada. ¿El & símbolo tiene sentido para usted ahora? – Tomas

+0

Está bien, creo que lo tengo algo deprimido (las indicaciones siempre me confundieron, y realmente estoy tratando de entenderlas). Creo que tengo una buena comprensión de eso ahora. – Biosci3c

-1

Puede ser más fácil para usted entender el uso de Functionoids que son expresivamente más nítidos y más potentes de usar, consulte esta excelente y muy recomendada C++ FAQ lite, en particular, consulte la sección 33.12 en adelante, pero no obstante, léala desde el inicio de esa sección para obtener una comprensión y entendimiento de ella.

Para responder a su pregunta:

typedef void (*foobar)() fubarfn; 

void Fun(fubarfn& baz){ 
    fubarfn = baz; 
    baz(); 
} 

Editar:

  • & significa que la dirección de referencia
  • *: el valor de lo que está contenido en la dirección de referencia, llamado de- haciendo referencia a

Por lo tanto, al usar la referencia, ejemplo a continuación, se muestra que estamos pasando un parámetro y lo modificamos directamente.

void FunByRef(int& iPtr){ 
    iPtr = 2; 
} 

int main(void){ 
    // ... 
    int n; 
    FunByRef(n); 
    cout << n << endl; // n will have value of 2 
} 
+0

Quizás debería aclarar. No estoy tratando de usar un puntero a una función, pero paso un puntero a un objeto (digamos un int) a la función, por lo que la función puede operar en él. Revisaré mi pregunta para aclarar esto. – Biosci3c

1
void Fun(int *Pointer) 
{ 
    //if you want to manipulate the content of the pointer: 
    *Pointer=10; 
    //Here we are changing the contents of Pointer to 10 
} 

* antes de que el puntero se entiende el contenido del puntero (excepto en declaraciones!)

& antes de que el puntero (o cualquier variable) significa la dirección

EDIT:

int someint=15; 
//to call the function 
Fun(&someint); 
//or we can also do 
int *ptr; 
ptr=&someint; 
Fun(ptr); 
+0

Esa es la sintaxis C cuando el OP claramente especificó C++ .... – t0mm13b

+0

@ tommieb75: ¿por qué es importante que sea válido C? También es sintaxis C++, y el que pregunta no especificó "C++, con C eliminado". Sea lo que sea. –

3

Para pasar un puntero a un int, debe ser void Fun(int* pointer).

pasando una referencia a un int se vería así ...

void Fun(int& ref) { 
    ref = 10; 
} 

int main() { 
    int test = 5; 
    cout << test << endl; // prints 5 

    Fun(test); 
    cout << test << endl; // prints 10 because Fun modified the value 

    return 1; 
} 
3

Si desea pasar un puntero a int en su función,

Declaración de la función (si es preciso):

void Fun(int *ptr); 

Definición de la función:

void Fun(int *ptr) { 
    int *other_pointer = ptr; // other_pointer points to the same thing as ptr 
    *other_ptr = 3;   // manipulate the thing they both point to 
} 

Uso de la función:

int main() { 
    int x = 2; 
    printf("%d\n", x); 
    Fun(&x); 
    printf("%d\n", x); 
} 

Tenga en cuenta, como regla general, que las variables llamadas Ptr o Pointer nunca deben tener el tipo int, que es lo que tiene entonces en su código. Un puntero a int tiene el tipo int *.

Si tengo un segundo indicador (int * uf), a continuación:

bar = uf significa: Barra de puntos a la oof puntero

significa "hacer punto de la barra de lo mismo de puntos a ".

bar = * uf significa: Barra de referencia al valor que los puntos a oof, pero no a la propia

puntero uf Eso no significa nada, es válido. bar es un puntero *oof es un int. No puedes asignar uno al otro.

* barra * = uf significa: cambiar el valor que los puntos de barras para que el valor que uf puntos a

Sí.

& bar = & uf significa: cambiar la dirección de la memoria que los puntos de bar a ser el mismo como la dirección de memoria que los puntos oof a

No, eso es inválida nuevo. &bar es un puntero a la variable bar, pero es lo que se llama un "rvalue", o "temporal", y no se puede asignar a. Es como el resultado de un cálculo aritmético. No puede escribir x + 1 = 5.

Podría ayudarlo a pensar en punteros como direcciones. bar = oof significa "hacer barra, que es una dirección, igual a oof, que también es una dirección". bar = &foo significa "hacer barra, que es una dirección, igual a la dirección de foo". Si bar = *oof significa algo, significaría "make bar, que es una dirección, igual a *oof, que es un int". No puedes.

Luego, & es el operador de la dirección. Significa "la dirección del operando", por lo que &foo es la dirección de foo (es decir, un puntero a foo). * es el operador de desreferencia. Significa "lo que está en la dirección dada por el operando". Así que habiendo hecho bar = &foo, *bar es foo.

1
void Fun(int* Pointer) -- would be called as Fun(&somevariable) 

le permitiría manipular el contenido de lo puntos 'puntero' a desreferenciando dentro de la es decir, la función Diversión

*Pointer = 1; 

declarar como anteriormente también permite también permite manipular datos más allá de lo que se puntos a:

int foo[10] = {0}; 
Fun(foo); 

en la función que luego puede hacer como * (Puntero + 1) = 12; estableciendo el 2do valor de la matriz.

void Fun(int& Pointer) -- would be called Fun(somevariable) 

puede modificar lo que las referencias a puntero, sin embargo, en este caso no se puede acceder a cualquier cosa más allá de lo que las referencias a puntero.

12

Declarar una función que toma un puntero a un int:

void Foo(int *x);

Para utilizar esta función:


int x = 4; 
int *x_ptr = &x; 
Foo(x_ptr); 
Foo(&x); 

Si desea un puntero para otro tipo de objeto, es mucho el mismo:

void Foo(Object *o);

Pero, es posible que prefiera utilizar referencias. Ellos son algo menos confusa que los punteros:


// pass a reference 
void Foo(int &x) 
{ 
    x = 2; 
} 

//pass a pointer 
void Foo_p(int *p) 
{ 
    *x = 9; 
} 

// pass by value 
void Bar(int x) 
{ 
    x = 7; 
} 
int x = 4; 
Foo(x); // x now equals 2. 
Foo_p(&x); // x now equals 9. 
Bar(x); // x still equals 9. 

Con referencias, sigue recibiendo a cambiar la X que se pasa a la función (como lo haría con un puntero), pero usted no tiene que preocuparse por la eliminación de referencias o dirección de operaciones.

Según lo recomendado por otros, consulte C++FAQLite. Es un excelente recurso para esto.

Editar 3 Respuesta:

bar = & foo significa: Hacer punto a foo bar en la memoria

Sí.

* bar = foo significa cambio el valor que los puntos de barras para igualar lo que es igual a foo

Sí.

Si tengo un segundo indicador (int * uf), entonces:

bar = uf significa: puntos de barras para el puntero uf

barra apuntará a cualquier oof puntos a. Ambos señalarán lo mismo.

bar = * uf significa: puntos de barras para el valor que los puntos a oof, pero no a la propia puntero uf

No. No puede hacer esto (suponiendo barra es de tipo int *) Puede hacer punteros punteros. (int **), pero no entremos en eso ... No puedes asignar un puntero a un int (bueno, puedes, pero eso es un detalle que no está en línea con la discusión).

* barra * = uf significa: cambiar el valor que los puntos de barras para que el valor que los puntos oof a

Sí.

& bar = & uf significa: cambiar la dirección de memoria que los puntos de barras a ser la misma que la dirección de memoria que los puntos oof a

No. No puede hacer esto porque la dirección del operador devuelve un rvalue Básicamente, eso significa que no puedes asignarle nada.