今天去面試 面試官問(wèn)我 a->b 跟 a.b有啥區(qū)別,我說(shuō)第一個(gè)是通過(guò)指針去訪問(wèn)成員,第二個(gè)是點(diǎn)語(yǔ)法去訪問(wèn) ,一般用在結(jié)構(gòu)體變量去訪問(wèn)其內(nèi)部成員b 是通過(guò)指針偏移去查找的
typedef struct Student {
int age;
char *name;
}
Student *st1;
Student *st2;
變量名只是結(jié)構(gòu)體首元素的地址
st1->age 是指針從0位置 取出4個(gè)字節(jié) 就是 age 的內(nèi)存地址(int類(lèi)型 4個(gè)字節(jié))
st1->name 是指針跳過(guò)前4個(gè)字節(jié) 取出 name 所在的4個(gè)字節(jié)的內(nèi)存
st1.age 是指針從0位置 取出4個(gè)字節(jié) 就是 age 的內(nèi)存地址(int類(lèi)型 4個(gè)字節(jié))
st1.name 是指針跳過(guò)前4個(gè)字節(jié) 取出 name 所在的4個(gè)字節(jié)的內(nèi)存
當(dāng)時(shí)回答的是通過(guò)a->b ,a.b是兩種不同的訪問(wèn)方式 屬于編譯器語(yǔ)法,訪問(wèn)結(jié)構(gòu)體內(nèi)部成員本質(zhì)就是通過(guò)首地址偏移去訪問(wèn)內(nèi)部成員.
下邊通過(guò)匯編代碼來(lái)解釋a->b 和 a.b 的區(qū)別
mov dword ptr [ebp-8] , eax 從 eax( *st 所指向內(nèi)存) 寄存器里取出4個(gè)字節(jié) 存放到 ebp-8里邊
mov dword ptr [ebp-0Ch] , eax 從eax寄存器重取出4個(gè)字節(jié)數(shù)據(jù) 放到 ebp-0Ch里邊
從匯編代碼可要看出來(lái) a->b ,a.b 沒(méi)有本質(zhì)區(qū)別 都是從內(nèi)存里取出4個(gè)字節(jié)的數(shù)據(jù) ,找到 b 所在內(nèi)存
如果要通過(guò)st->name 匯編代碼又是怎么樣子呢?
mov dword ptr [ebp-10h],eax ==> st1->age
mov dword ptr [ebp-0Ch],eax ==> st1->name
[ebp-10h] st1->age的地址值 十進(jìn)制16對(duì)應(yīng)的是十六進(jìn)制 10 所以這里是ebp-10h
[ebp-0Ch] st1->name的地址值 十進(jìn)制12對(duì)應(yīng)對(duì)應(yīng)十六進(jìn)制C 所以這里是ebp-0Ch
可以看出來(lái) 從st1->name 到st1->age 是相差4個(gè)字節(jié)的,所以結(jié)構(gòu)體訪問(wèn)其成員變量就是通過(guò)指針地址偏移完成的
從匯編上看a->b 和 a.b 本質(zhì)是一樣的 都是通過(guò)eax取出4個(gè)字節(jié) 放到一個(gè)內(nèi)存地址里 這個(gè)內(nèi)存地址 根據(jù)在結(jié)構(gòu)體里成員屬性的位置而不同