pragma mark 结构体-在内存中的存储细节
pragma mark 概念
pragma mark 代码
#include <stdio.h>
int main()
{
#warning 数组的存储细节 -- 查看function
/*
// 1. 内存寻址 从大到小
// 2. 存储数组元素 从小到大
// 3. 数组的地址 就是 数组首元素的地址
int nums[3] = {1,3,5};
#warning 结构体的存储细节 -- 查看function1
// 注意 : 定义结构体类型并不会分配存储空间
// 只有定义结构体变量 才会真正的分配存储空间
struct Person
{
int age; // 4
int height; // 4
int width; // 4
};
struct Person sp;
// 从当前来看, 结构体变量所占用的存储空间就是它所有属性所占用存储空间的总和
printf("size = %lu\n",sizeof(sp));
printf("&age = %p\n",&sp.age);
printf("&height = %p\n",&sp.height);
printf("&width = %p\n",&sp.width);
// 结构体名称并不是结构体的地址
// printf("&sp = %p\n",sp);
// 结构体的地址就是他第9个属性的地址
printf("\n&sp = %p\n",&sp);
printf("&age = %p\n",&sp.age);
*/
#warning 结构体是如何分配存储空间 查看function2
// 结构体会首先找到所有属性中 占用内存空间最大的那个属性,然后按照该属性的 倍数类 分配存储空间
// 1. 找到结构体类型占用存储空间最大的属性,以后就按照该属性占用的存储空间分配(在当前这种情况 每次分配8个字节)
// 2. 会从第0个属性开始分配存储, 如果存储空间 不够就会 重新分配, 如果存储空间还有剩余, 那么就会把后面的属性的数据 存储 剩余的存储空间中
/*
struct Person
{
double height; // 8
int age; // 4
char c; // 1
};
struct Person sp;
*/
// 3. 会从第0个属性开始分配存储, 如果存储空间 不够就会 重新分配, 并且会将当前属性的值 直接存储到新分配的存储空间中, 以前剩余的存储空间就不要了
struct Person
{
int age; // 4
double height; // 8
char c; // 1
};
struct Person sp;
printf("size = %lu\n",sizeof(sp));
// 注意 : 为什么要按照所有属性中占用存储空间最大的属性的字节 来分配存储空间呢?
// 主要是为了提高计算机的运输速度
return 0;
}
void function()
{
// 内存寻址从大到小 最先开始初始化的时候 是放在最上面
/*
地址 变量 内容
offc1
offc2
offc3 nums nums[0] // 数组的地址
offc4 nums nums[0]
offc5 nums nums[0]
offc6 nums nums[0]
offc7 nums nums[1]
offc8 nums nums[1]
offc9 nums nums[1]
offc10 nums nums[1]
offc11 nums nums[2]
offc12 nums nums[2]
offc13 nums nums[2]
offc14 nums nums[2]
*/
}
void function1()
{
/*
地址 变量 内容
offc1
offc2
offc3 sp age // 年龄的地址
offc4 sp age
offc5 sp age
offc6 sp age
offc7 sp height // 高度的地址
offc8 sp height
offc9 sp height
offc10 sp height
offc11 sp width // 宽度的地址
offc12 sp width
offc13 sp width
offc14 sp width
*/
}
void function2()
{
#warning 分配1
/*
地址 变量 内容
offc1
offc2
offc3 sp height // 高度的地址
offc4 sp height
offc5 sp height
offc6 sp height
offc7 sp height
offc8 sp height
offc9 sp height
offc10 sp height
offc11 sp age // 年龄的地址
offc12 sp age
offc13 sp age
offc14 sp age
offc15 sp c // 姓名的地址
offc16 sp
offc17 sp
offc18 sp
*/
#warning 分配2
/*
地址 变量 内容
offc1
offc2
offc3 sp age // 年龄的地址
offc4 sp age
offc5 sp age
offc6 sp age
offc7 sp
offc8 sp
offc9 sp
offc10 sp
offc11 sp height // 高度的地址
offc12 sp height
offc13 sp height
offc14 sp height
offc15 sp height
offc16 sp height
offc17 sp height
offc18 sp height
offc11 sp c // 姓名的地址
offc12 sp
offc13 sp
offc14 sp
offc15 sp
offc16 sp
offc17 sp
offc18 sp
*/
}