(一)计算结构体struct需要的内存空间
#import
// 定义一个三维的点结构体,名字叫 AA_Point
// Note:注意类型是 struct AA_Point
// 不要直接单独使用 AA_Point
struct AA_Point {
int x;
int y;
int z;
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"struct AA_Point 需要内存空间size:%lu", sizeof(struct AA_Point));
// 创建一个点
struct AA_Point point_1 = {3, 4, 5};
NSLog(@"结构体变量 point_1 需要内存空间size:%lu", sizeof(point_1));
}
return 0;
}
打印结果如下:
struct AA_Point 需要内存空间size:12
结构体变量 point_1 需要内存空间size:12
在03节,我们已经验证了int需要4个字节,所以3个int类型,自然需要12个字节的内存空间,所以结构体类型struct AA_Point需要12个字节的内存空间.
(二)结构体指针变量
// 创建一个点
struct AA_Point point_1 = {3, 4, 5};
NSLog(@"结构体变量 point_1 需要内存空间size:%lu", sizeof(point_1));
struct AA_Point *p_AA_Point = &point_1;
NSLog(@"结构体变量 point_1 内存地址:%p", &point_1);
NSLog(@"结构体指针变量 p_AA_Point 内存地址:%p", &p_AA_Point);
NSLog(@"结构体指针变量 p_AA_Point 中的数据:%p", p_AA_Point);
NSLog(@"结构体指针变量 p_AA_Point 中的数据需要内存空间:%lu", sizeof(p_AA_Point));
打印结果如下:
结构体变量 point_1 内存地址:0x7ffeefbff500
结构体指针变量 p_AA_Point 内存地址:0x7ffeefbff4f8
结构体指针变量 p_AA_Point 中的数据:0x7ffeefbff500
结构体指针变量 p_AA_Point 中的数据需要内存空间:8
打印可以确认: p_AA_Point 中的数据就是变量 point_1 的内存地址. p_AA_Point 是不是自己也得有自己的地址.
结构体指针变量存放的是数据是内存地址,内存地址是64位机器下的,所以结构体指针变量就需要8个字节存储空间.
Note:在64位机器下,指针变量需要的内存空间都是8个字节,不管指向什么类型的变量.void * 可以指向任何类型,就是因为void *中的数据(内存地址数据)都是8个字节.
到这有点晕的小伙伴,最好再看看前面小节的内容,不然,就更晕了.
(三)结构体中有指针变量
结构体嵌套的内存空间计算,就请小伙伴们自己尝试一下了.
// 定义一个圆球结构体
struct AA_RoundBall {
// 定义圆心, 是一个指针结构体变量
struct AA_Point *circleCenter;
};
执行语句:
struct AA_RoundBall roundBall = {p_AA_Point};
NSLog(@"struct AA_RoundBall 需要内存空间size:%lu", sizeof(struct AA_RoundBall));
NSLog(@"结构体变量 roundBall 需要内存空间size:%lu", sizeof(roundBall));
打印结果如下:
struct AA_RoundBall 需要内存空间size:8
结构体变量 roundBall 需要内存空间size:8
(四)struct AA_RoundBall指针变量
struct AA_RoundBall *p_AA_RoundBall = &roundBall;
NSLog(@"struct AA_RoundBall * 需要内存空间size:%lu", sizeof(struct AA_RoundBall *));
NSLog(@"结构体指针变量 roundBall 需要内存空间size:%lu", sizeof(p_AA_RoundBall));
打印结果如下:
struct AA_RoundBall * 需要内存空间size:8
结构体指针变量 roundBall 需要内存空间size:8
结构体成员变量含有指针变量,这个结构体又可以创建结构体指针变量.如果感觉很晕,本质上还是对指针变量的不理解.
PS: 指针变量首先它是一个变量,变量是不是得给它一个地址,放东西.这个东西有点特殊,是另一个内存地址.指针变量和普通变量都一样,都有一个地址,都需要一个内存空间放数据.
GitHub项目代码