Pregunta

A partir de las conferencias notas de un curso en la universidad, en "Call-by-valor":

void fun(int *ip)

{

*ip =100;

}

llamado por

int n=2;  

int *np;

np = &n; 

fun(np);
     

cambiaría el valor de n a 100.

Cuando decimos "int * ip", qué es exactamente lo que queremos decir? Un puntero de tipo entero? Si es así, cuando llamamos a la diversión () con np como su argumento, no debe haber un error, como NP tiene la dirección de n, que no es un entero?

Y a continuación, se cambia el valor de ip a 100, por lo que no quiere decir eso de que n tiene ahora el valor que está en la "ranura de memoria" con la dirección 100? Estoy seguro de que me falta algo. :)

¿Fue útil?

Solución

  

Un puntero de tipo entero?

No, un puntero a un entero.

  

cuando llamamos diversión () con np como su argumento, no debería haber un error, como NP tiene la dirección de n, que no es un entero?

n es un entero así que no hay problema. &n, np y ip todos tienen el mismo tipo en el código:. int*

  

Y a continuación, se cambia el valor de IP de 100

No se ... que cambie el valor de *ip, no de ip. Es decir, cambiamos el valor que ip puntos a (que es también llamado a veces el pointee ).

Otros consejos

Sí, cuando se utiliza int * como un tipo de parámetro de fun que está diciendo que acepta un puntero a un int. Desde np es un puntero a un int que pasa en fun está bien.

np y ip están apuntando a la dirección de n, por lo que cuando se asigna un valor como *ip = 42, asignará el valor de la 42 a la posición de memoria que está apuntando a ip -. Que es n

Lo que tienes en el código de ejemplo se llama pasar por el puntero . Su función tiene un parámetro de tipo puntero a entero . Por lo que el valor que se pasa a la función es la dirección de la variable n. Los cesionarios de función 100 a la variable (es decir, una posición de memoria) señaló a por el ip parámetro de puntero. El * estrella es el operador de eliminar la referencia en C / C ++.

en la diversión (), que no están cambiando el valor de ip a 100, que está cambiando la en la posición de memoria apuntada por ip.

type* utiliza como un medio de tipo "un puntero a ese tipo"

El uso común es int *var, pero me gusta escribir como int* var como que hace una mejor distinción de dereferenceing un puntero, es decir *ptr.

so medios int* a, a es un puntero a un objeto de tipo int, *a significa que el objeto apuntado por los medios A y &a la dirección del objeto a.

pensar en np como de tipo int*. Tenga en cuenta que para este fin el asterisco y la int juntos hacen un tipo "puntero a int", y no son separable.

ip es un puntero, con ip* se accede a la "ranura de memoria" se está señalando. np es también un puntero. Usando &n le asigne la dirección de la ranura de memoria de n a np. Así que cuando se llama a fun(), dentro fun() la única ranura de memoria que se accede es el de n y por lo tanto a n 100 se le asigna.

Algunos confusión es posible aquí porque ambos almacenan números n y NP - sin embargo, cuando se compila, el compilador usará los números de manera diferente; Es decir, mientras

n++;

y

np++;

son ambas operaciones aritméticas en realidad, la generada montaje es diferente. Es importante recordar que, en última instancia, todos los datos en el ordenador son números. Se convierten en diferentes tipo de los datos simplemente porque los tratamos de forma diferente.

Específicamente con respecto a su ejemplo,

*np = 100;

Es necesario recordar que los medios * eliminar la referencia , y que la operación ocurre antes de la asignación. Puede ser más clara con paréntesis superflua:

(* (np) ) = 100;

o en un contexto diferente:

int n = *np;

Ahora, hay que decir, que se calienta mi corazón cuando usted dice:

  

que cambia el valor de ip a 100, por lo que no quiere decir eso de que n tiene ahora el valor que está en la "ranura de memoria" con la dirección 100?   ya que contradice lo que considero como una comprensión importante. Sin embargo, creo que estoy en lo cierto cuando digo, usted debe salir de su manera de hacer ese tipo de cosas a los punteros:

static_cast<int>(np) = 100;

Esto haría lo que usted describe, ya que indica a la computadora para tratar el número que es np como un tipo diferente de número; de la misma manera que static_cast<char*>(np) trataría a los puntos número np como un personaje, en lugar de como un entero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top