Aquesta pàgina explica, pas a pas i amb exemples reals en C, els conceptes fonamentals de memòria, adreces i punters utilitzant la cadena de text "Hola món".
Tot el codi que veuràs es pot compilar i executar. Les adreces que apareixen són adreces virtuals (les que veu el teu programa), no les físiques de la RAM.
En C, una cadena de text és un array de char acabat amb un caràcter nul '\0'.
Internament, la memòria reserva 10 bytes consecutius (un per a cada lletra, espai, accent i el zero final).
⬆️ Cada byte té la seva pròpia adreça. La cadena ocupa 10 bytes seguits.
El nom de l'array salutacio ja és un punter constant al primer element. Per tant, salutacio equival a &salutacio[0].
p conté un número d'adreça, no la lletra 'H'. Per veure la lletra cal desreferenciar el punter amb *p.
Afegim printf per veure què hi ha realment dins de p, dins de &p i el valor apuntat.
Una possible sortida (les adreces canvien cada execució):
p i salutacio donen la mateixa adreça. Però l'adreça on es guarda p (&p) és completament diferent!
| Expressió | Significat | Exemple de valor |
|---|---|---|
salutacio | Adreça del primer caràcter (punter constant) | 0x7fffb45c8a30 |
&salutacio[0] | Mateixa adreça que salutacio | 0x7fffb45c8a30 |
p | Variable punter que conté l'adreça de salutacio[0] | 0x7fffb45c8a30 |
&p | Adreça on s'emmagatzema el punter p | 0x7fffb45c8a18 |
*p | Valor del primer caràcter ('H') | H |
*(p+3) | Quart caràcter ('a') | a |
p[3] | Equivalent a *(p+3) | a |
Un punter no sols apunta al primer element. Sumant-li enters avancem byte a byte per la cadena.
char és un byte. L'accent de la 'ó' pot ocupar 2 bytes en codificació UTF-8. Aquí simplifiquem amb un sol byte per lletra (Latin-1).
Com que salutacio és un array (modificable), podem canviar un caràcter usant el punter.
Això demostra que el punter dóna accés directe a la memòria original.
Com ja hem dit, un programa normal d'usuari mai veu adreces físiques. %p imprimeix l'adreça virtual assignada pel sistema operatiu. Cada execució pot donar valors diferents gràcies a l'ASLR (randomització del layout de l'espai d'adreces).
Si intentessis saber l'adreça física des d'un programa normal, el sistema t'ho impediria per seguretat i aïllament entre processos.
Prem el botó per generar una representació visual de la memòria amb adreces aleatòries (simulades) i veure com el punter p hi apunta.
Les adreces són fictícies però il·lustren la diferència entre el valor i la seva ubicació.
& obté l'adreça d'una variable; * hi accedeix al valor.char permet recórrer i modificar una cadena.