以下是引用朔源在2015-10-30 15:20:17的发言:
你好!TonyDeng
int x; // 在内存中創建一個變量
int* p = &x; // 創建一個指針變量,它儲存的値是x的地址
你说的创建变量 x 和指针变量 p 将 x 变量的地址给指针变量 p 。这样它们的地址就相同了。这我理解。
而 int * p,i,a[10]; 后面并没有使i 和a[10]地址相等的赋值语句。
我加了变量如: int * p,i,a[10],b;变量 b 运行后 变量 b 的内存地址和其他又不同了。我想应该是 i 和a[10]之间应该是有什么联系。
因为只有它们两个变量在程序开始时分配的内存地址是相同的。而其他变量的地址则和 i 与a[10]不同 。
before scanf:
p address:0x0012FF50
i address:0x0012FF78
a[10] address:0x0012FF78
b address:0x0012FF4C // b 是新加的变量它的地址和其他三个都不一样
88
9 8 7 6 5 4 3 2 1 0
after scanf:
p address:0x0012FF78
i address:0x0012FF78
a[10] address:0x0012FF78
b address:0x0012FF4C // b 变量地址
0 1 2 3 4 5 6 7 8 9
x是一個變量,p也是一個變量,各自占用不同的地址,後者儲存的值是前者的地址,不是兩者的地址相同!兩個變量,由於創建它們的語句是緊鄰的,所以在棧中的地址通常也是緊鄰的。用指針訪問,當指針變量所儲存的值落入其他變量的位置,就可能破壞數據,這種動作C語言不檢查,是否允許,由程序的邏輯決定;另一種情況,訪問操作系統禁止或硬件不存在、不允許讀寫的地址,會在運行時報錯,這就是那著名的非法讀寫崩潰畫面的來源。
[此贴子已经被作者于2015-10-30 17:15编辑过]