Domanda

dalle lezioni note di un corso all'università, il "call-by-value":

void fun(int *ip)

{

*ip =100;

}

chiamato da

int n=2;  

int *np;

np = &n; 

fun(np);
     

cambierebbe il valore di n per 100.

Quando diciamo "int * ip", che cosa esattamente intendiamo? Un puntatore di tipo intero? Se è così, quando chiamiamo divertimento () con np come argomento, non dovrebbe esserci un errore come np ha l'indirizzo di n, che non è un numero intero?

E poi, modificare il valore di ip a 100, quindi non vuol dire che n ora ha il valore che è nel "slot di memoria" con l'indirizzo 100? Sono sicuro che mi manca qualcosa. :)

È stato utile?

Soluzione

  

Un puntatore di tipo intero?

No, un puntatore a un intero.

  

quando chiamiamo divertimento () con np come argomento, non dovrebbe esserci un errore come np ha l'indirizzo di n, che non è un numero intero?

n è un intero quindi non c'è nessun problema. &n, np e ip hanno tutti lo stesso tipo nel codice:. int*

  

E poi, cambiamo il valore di ip e 100

No ... cambiamo il valore di *ip, non di ip. Cioè, cambiamo il valore che ip punta a (che è anche talvolta chiamato il pointee ).

Altri suggerimenti

Sì, quando si utilizza int * come tipo di parametro di fun stai dicendo che accetta un puntatore a un int. Dal momento che np è un puntatore ad un int passando in fun è ok.

np e ip stanno indicando l'indirizzo del n, in modo che quando si assegna un valore come *ip = 42, si assegnerà il valore di 42 alla posizione di memoria che ip sta indicando a -. Che è n

Quello che hai nel codice di esempio si chiama passare puntatore . La funzione ha un parametro di tipo puntatore a intero . Quindi il valore passato alla funzione è l'indirizzo del n variabile. La funzione assegna 100 alla variabile (cioè una posizione di memoria) indicate a dal parametro pointer ip. Il * stella è il operatore dereference in C / C ++.

nel divertimento (), si è non cambiare il valore di IP per 100, si sta cambiando la corrispondenza della posizione di memoria puntato da ip.

type* utilizzato come un tipo significa "un puntatore a tale tipo"

uso comune è int *var, ma mi piace scrivere come int* var come che lo rende una distinzione meglio da dereferenceing un puntatore, cioè *ptr.

mezzi così int* a, a è un puntatore a un oggetto di tipo int, *a significa che l'oggetto puntato da un &a e indica l'indirizzo dell'oggetto a.

pensare np come di tipo int*. Tenete a mente che a questo scopo l'asterisco e la int insieme fanno un "puntatore a int" tipo, e non sono separatable.

ip è un puntatore, con ip* si accede alla "slot di memoria" è rivolto a. np è anche un puntatore. Utilizzando &n si assegna l'indirizzo della slot di memoria di n a np. Così, quando si chiama fun(), all'interno fun() l'unico slot di memoria che è accessibile è quella di n e quindi di n 100 è assegnato.

Alcuni confusione è possibile qui perché entrambi n e conservare np numeri - tuttavia, durante la compilazione, il compilatore utilizzerà i numeri in modo diverso; vale a dire, mentre

n++;

e

np++;

sono operazioni aritmetiche in realtà, il complesso generato è differente. E 'importante ricordare che, in ultima analisi, tutti i dati del computer sono i numeri. Diventano diversi tipo di dati solo perché li trattiamo in modo diverso.

In particolare per quanto riguarda il tuo esempio,

*np = 100;

è necessario ricordare che i mezzi * dereferenziare , e che il funzionamento avviene prima della cessione. Può essere più chiaro con parentesi superflue:

(* (np) ) = 100;

o in un contesto diverso:

int n = *np;

Ora, devo dire, mi scalda il cuore quando si dice,

  

cambiare il valore di ip a 100, quindi non vuol dire che n ora ha il valore che è nel "slot di memoria" con l'indirizzo 100?   come si smentisce quello che io considero un accordo importante. Tuttavia, credo che ho ragione quando dico, si deve andare dal tuo modo di fare questo genere di cose ai puntatori:

static_cast<int>(np) = 100;

Questo sarebbe fare quello che hai descritto, perché dice al computer di trattare il numero che è np come un diverso tipo di numero; nello stesso modo che static_cast<char*>(np) tratterebbe punti numero np come un carattere, piuttosto che come un intero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top