美文网首页
数组结构体占空间大小

数组结构体占空间大小

作者: Dylan_fe7f | 来源:发表于2019-02-19 08:50 被阅读0次

1.地址的强制转换

先看下面这个例子:
struct Test
{
int Num;
char pcName;
short sDate;
char cha[2];
short sBa[4];
}
p;

假设p 的值为0x100000。如下表表达式的值分别为多少?
p + 0x1 = 0x___ ?
(unsigned long)p + 0x1 = 0x___?
(unsigned int*)p + 0x1 = 0x___?

指针变量与一个整数相加减并不是用指针变量里的地址直接加减这个整数。这个整数的单位不是byte 而是元素的个数。所以:p + 0x1 的值为0x100000+sizof(Test)*0x1。至于此结构体的大小为20byte,前面的章节已经详细讲解过。所以p +0x1 的值为:0x100014。

(unsigned long)p + 0x1 的值呢?这里涉及到强制转换,将指针变量p 保存的值强制转换成无符号的长整型数。任何数值一旦被强制转换,其类型就改变了。所以这个表达式其实就是一个无符号的长整型数加上另一个整数。所以其值为:0x100001。

(unsigned int)p + 0x1 的值呢?这里的p 被强制转换成一个指向无符号整型的指针。所以其值为:0x100000+sizof(unsigned int)0x1,等于0x100004。

2.数组a[],a,&a之间的区别

通俗理解:内存就是公寓房间,指针就是房间的门牌号,数组就是连续的公寓房间,数组名就是这组连续房间的起始地址,也就是第一个房间的地址。
例如int a[5]
a是数组名,也就是第一个房间号&a就是整个数组的门牌号,值和第一个门牌号相等,但是物理意义不一样。

int main()
{
int a[5];
printf("%d\n",a); //指向第一个数组元素的首地址 1245036
printf("%d\n",&a); //指向整个数组的地址 1245036
printf("%d\n",a + 1); //a[1]元素的地址 1245040
printf("%d\n",&a + 1); //整个数组的字节长度4*5=20 1245056
printf("%d\n",&a[0] + 1); //下一个元素的地址,下一个门牌号 1245040
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));
return 0;
}

分析:
由运行结果可知,数组名a和&a得[内存地址]相同。我们由数组和指针的关系知道,a代表这个数字,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的。所以有a+1为1245040,即数组中a[1]的地址是1245040(在首地址1245036基础上加int的字节数4得到的)。

然而,&a代表的不是取a这个变量的地址,而是取数组元素的地址。虽然&a和a得内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度(这里是4*5=20),所以&a+1得内存地址为1245056。

其实,a的类型是int[5] 数组
&a的类型是int()[5] 指针——指向int[5]数组的指针
&a[0]的类型是int
指针——指向int类型的指针

另外,当用sizeof时,由于它是个关键词,而不是个函数,所以数组不自动转换为指针,得到的结果是数组的长度*数组中元素类型所占的字节数,本例中sizeof(a)和sizeof(&a)都是20.

ps:如果是(int)a +1,则结果是1245037(即1245036+1)

相关文章

  • 数组结构体占空间大小

    1.地址的强制转换 先看下面这个例子:struct Test{int Num;char pcName;short ...

  • c语言基本学习_基本记录

    基本数据类型 可变参数 宏定义 结构体 联合体[和结构体类似,成员共占一块空间,数据大小根据最大的数据类型确定] ...

  • ndk-基础知识

    数组和指针,数组指针,指针数组 结构体 内存对齐 内存对齐 结构体大小 S5DUD10BN083MHEJEX7TP...

  • 结构体内存对齐

    结构体的内存对齐操作 结构体不像数组,结构体中可以存放不同类型的数据,它的大小也不是简单的各个数据成员大小之和,限...

  • 数组,切片

    值传递:数组,结构体指针(地址)传递:切片,结构体方法 数组 1.元素交换 切片 内存扩容,在内存大小小于1024...

  • Head First C 学习之结构体、联合、枚举、为字段(st

    结构体 位于Head First C 第220页: 结构的大小固定 结构中的数据都有名字 结构体和数组有些相像,但...

  • C语言中的柔性数组

    C语言中 结构体末尾如果是定义的数组,那么这个数组只是一个标识符 并不占用结构体大小。 我们可以在结构体中定义一个...

  • 结构体数组的定义

    结构体数组的定义 1、先定义结构体类型,再定义结构体数组 2、定义结构体类型的同时定义结构体数组 3、省略结构体类...

  • golang入门到放弃:4.结构体

    定义 eg: 结构体数组 结构体数组 定义 结构体数组名 [元素个数]结构体类型 eg//var arr [5]P...

  • C语言 13 结构体数组

    C语言 13 结构体数组 结构体数组的定义 结构体数组初始化 结构体成员的使用 格式 : 字符串成员的处理 结构体...

网友评论

      本文标题:数组结构体占空间大小

      本文链接:https://www.haomeiwen.com/subject/ggatyqtx.html