Ok, quindi C è un valore pass-by, il che significa che una copia della variabile viene utilizzata al posto della variabile originale per il parametro, giusto? Quindi, quella copia avrà sempre lo stesso indirizzo di memoria? Considerate questo codice:Un parametro di funzione in C ha sempre lo stesso indirizzo di memoria?
void test(int *ptr) {
printf("&ptr: %p\n", &ptr);
printf("ptr: %p\n", ptr);
printf("*ptr: %d\n\n", *ptr);
}
int main() {
int a = 1, b = 2, c = 3, d = 4, e = 5;
test(&a);
test(&b);
test(&c);
test(&d);
test(&e);
return 0;
}
L'uscita che ricevo da questo codice è questo:
&ptr: 0x7fff70536728
ptr: 0x7fff7053674c
*ptr: 1
&ptr: 0x7fff70536728
ptr: 0x7fff70536750
*ptr: 2
&ptr: 0x7fff70536728
ptr: 0x7fff70536754
*ptr: 3
&ptr: 0x7fff70536728
ptr: 0x7fff70536758
*ptr: 4
&ptr: 0x7fff70536728
ptr: 0x7fff7053675c
*ptr: 5
La mia sensazione è stata "no". È a mia conoscenza che lo ptr
non esiste al di fuori del blocco di codice di test()
. Quindi, perché lo &ptr
è lo stesso per tutte e cinque le chiamate di funzione?
Non è garantito lo stesso. Stai osservando un comportamento non specificato. (Puoi vedere il cambio di indirizzo se lo chiami da un'altra funzione oltre a quella principale.) –
e potrebbe non mostrare affatto questo comportamento, anche senza una chiamata di funzione intermedia. a seconda dell'implementazione su una macchina particolare. –
@AndyzSmith dipende anche da come il compilatore decide di implementarlo. :) – jmstoker