(一)計(jì)算結(jié)構(gòu)體struct需要的內(nèi)存空間
#import <Foundation/Foundation.h>
// 定義一個(gè)三維的點(diǎn)結(jié)構(gòu)體,名字叫 AA_Point
// Note:注意類型是 struct AA_Point
// 不要直接單獨(dú)使用 AA_Point
struct AA_Point {
int x;
int y;
int z;
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"struct AA_Point 需要內(nèi)存空間size:%lu", sizeof(struct AA_Point));
// 創(chuàng)建一個(gè)點(diǎn)
struct AA_Point point_1 = {3, 4, 5};
NSLog(@"結(jié)構(gòu)體變量 point_1 需要內(nèi)存空間size:%lu", sizeof(point_1));
}
return 0;
}
打印結(jié)果如下:
struct AA_Point 需要內(nèi)存空間size:12
結(jié)構(gòu)體變量 point_1 需要內(nèi)存空間size:12
在03節(jié),我們已經(jīng)驗(yàn)證了int需要4個(gè)字節(jié),所以3個(gè)int類型,自然需要12個(gè)字節(jié)的內(nèi)存空間,所以結(jié)構(gòu)體類型struct AA_Point需要12個(gè)字節(jié)的內(nèi)存空間.
(二)結(jié)構(gòu)體指針變量
// 創(chuàng)建一個(gè)點(diǎn)
struct AA_Point point_1 = {3, 4, 5};
NSLog(@"結(jié)構(gòu)體變量 point_1 需要內(nèi)存空間size:%lu", sizeof(point_1));
struct AA_Point *p_AA_Point = &point_1;
NSLog(@"結(jié)構(gòu)體變量 point_1 內(nèi)存地址:%p", &point_1);
NSLog(@"結(jié)構(gòu)體指針變量 p_AA_Point 內(nèi)存地址:%p", &p_AA_Point);
NSLog(@"結(jié)構(gòu)體指針變量 p_AA_Point 中的數(shù)據(jù):%p", p_AA_Point);
NSLog(@"結(jié)構(gòu)體指針變量 p_AA_Point 中的數(shù)據(jù)需要內(nèi)存空間:%lu", sizeof(p_AA_Point));
打印結(jié)果如下:
結(jié)構(gòu)體變量 point_1 內(nèi)存地址:0x7ffeefbff500
結(jié)構(gòu)體指針變量 p_AA_Point 內(nèi)存地址:0x7ffeefbff4f8
結(jié)構(gòu)體指針變量 p_AA_Point 中的數(shù)據(jù):0x7ffeefbff500
結(jié)構(gòu)體指針變量 p_AA_Point 中的數(shù)據(jù)需要內(nèi)存空間:8
打印可以確認(rèn): p_AA_Point 中的數(shù)據(jù)就是變量 point_1 的內(nèi)存地址. p_AA_Point 是不是自己也得有自己的地址.
結(jié)構(gòu)體指針變量存放的是數(shù)據(jù)是內(nèi)存地址,內(nèi)存地址是64位機(jī)器下的,所以結(jié)構(gòu)體指針變量就需要8個(gè)字節(jié)存儲空間.
Note:在64位機(jī)器下,指針變量需要的內(nèi)存空間都是8個(gè)字節(jié),不管指向什么類型的變量.void * 可以指向任何類型,就是因?yàn)関oid *中的數(shù)據(jù)(內(nèi)存地址數(shù)據(jù))都是8個(gè)字節(jié).
到這有點(diǎn)暈的小伙伴,最好再看看前面小節(jié)的內(nèi)容,不然,就更暈了.
(三)結(jié)構(gòu)體中有指針變量
結(jié)構(gòu)體嵌套的內(nèi)存空間計(jì)算,就請小伙伴們自己嘗試一下了.
// 定義一個(gè)圓球結(jié)構(gòu)體
struct AA_RoundBall {
// 定義圓心, 是一個(gè)指針結(jié)構(gòu)體變量
struct AA_Point *circleCenter;
};
執(zhí)行語句:
struct AA_RoundBall roundBall = {p_AA_Point};
NSLog(@"struct AA_RoundBall 需要內(nèi)存空間size:%lu", sizeof(struct AA_RoundBall));
NSLog(@"結(jié)構(gòu)體變量 roundBall 需要內(nèi)存空間size:%lu", sizeof(roundBall));
打印結(jié)果如下:
struct AA_RoundBall 需要內(nèi)存空間size:8
結(jié)構(gòu)體變量 roundBall 需要內(nèi)存空間size:8
(四)struct AA_RoundBall指針變量
struct AA_RoundBall *p_AA_RoundBall = &roundBall;
NSLog(@"struct AA_RoundBall * 需要內(nèi)存空間size:%lu", sizeof(struct AA_RoundBall *));
NSLog(@"結(jié)構(gòu)體指針變量 roundBall 需要內(nèi)存空間size:%lu", sizeof(p_AA_RoundBall));
打印結(jié)果如下:
struct AA_RoundBall * 需要內(nèi)存空間size:8
結(jié)構(gòu)體指針變量 roundBall 需要內(nèi)存空間size:8
結(jié)構(gòu)體成員變量含有指針變量,這個(gè)結(jié)構(gòu)體又可以創(chuàng)建結(jié)構(gòu)體指針變量.如果感覺很暈,本質(zhì)上還是對指針變量的不理解.