Potrei non aver avuto un controesempio quando ho ricevuto la risposta "Un puntatore è solo un indirizzo, qual è la difficoltà?" ma non ho davvero comprato una spiegazione così semplice e al codice assembly non è ovvio quale sia un puntatore per 2 diversi programmi C che generano lo stesso assembly.
cat pelle.s valle.s
.file "pelle.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
movl $0, %eax
popl %ebp
.cfi_def_cfa 4, 4
.cfi_restore 5
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
.file "valle.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
movl $0, %eax
popl %ebp
.cfi_def_cfa 4, 4
.cfi_restore 5
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
1) Un indirizzo di una variabile è &var1
e il puntatore è int* var1
scritto diversamente dall'indirizzo. 2) Quando compilo 2 programmi C in cui l'unica differenza è puntata, non c'è differenza nell'assembly:
$ diff pelle.c valle.c ;cat pelle.c valle.c;diff pelle.s valle.s
3c3
< int * pelle;
---
> int valle;
#include <stdio.h>
int main(void) {
int * pelle;
return 0;
}
#include <stdio.h>
int main(void) {
int valle;
return 0;
}
1c1
< .file "pelle.c"
---
> .file "valle.c"
Ma quali conclusioni si possono trarre da nessuna differenza nell'assemblaggio generato per indagare sulla "differenza semplice ed evidente" tra una dichiarazione puntatore e un altro tipo? La risposta semplicistica va sempre avanti, un puntatore è solo una variabile e non ha senso in più analisi? O che la differenza tra un puntatore e una variabile è un caso di "zucchero" poiché i tipi vengono rimossi a livello di assemblaggio dove non c'è differenza? Una differenza nell'assembly generato mostrerà una diff se uso i puntatori come argomenti per una funzione e ci sarà davvero una differenza per l'uso di un puntatore e questo esempio è troppo banale e non può essere generalizzato? Quindi, quando i tipi vengono rimossi nell'assieme generato, posso concludere che la differenza di tipo in effetti risulterà in una differenza nell'assieme generato per un esempio non banale, ad es. puntatori come argomenti e questo esempio non è molto buono poiché sembra che l'assembly generato ignori la digitazione, mentre la differenza di tipo come questa farà la differenza nell'assemblaggio generato per un altro esempio?
int valle;
int * pelle;
Assembler
.data
.align 2
.global valle
valle: .word 0
.data
.align 2
.global pelle
pelle: .word 0