LinuxC编程实参和形参的转化及sizeof用法
第一种情况#include void param_test(int a) { printf("addr(a) = %p ", &a); } int main() { int b = 10; printf("%s - addr(b) = %p ", __func__, &b); param_test(b); return 0; }$ ./1 main - addr(b) = 0x7ffea26bbc6c addr(a) = 0x7ffea26bbc4c
可以发现两次打印的地址不一样,实参和新参在内存中被分配了不同的地址。第二种情况void param_pointer_test(int *a) { printf("addr(a) = %p ", a); } int main() { int b = 10; printf("%s - addr(b) = %p ", __func__, &b); param_pointer_test(&b); return 0; }$ ./1 main - addr(b) = 0x7ffc9238b40c addr(a) = 0x7ffc9238b40c
通过指针传递参数,可以发现形参与实参的地址就会一样,从而里面存储的数据也是一样的。sizeof() 用法
1.定义
sizeof是一个操作符。
其作用是返回一个对象或类型所占的内存字节数。
2.语法
(1). sizeof(object); sizeof(对象)
(2). sizeof(type_name); sizeof(类型)
sizeof对对象求内存大小,最终都是转换为对象的数据类型进行求值。
sizeof(表达式),值为表达式的最终结果的数据类型的大小。int a; sizeof(int); //值为4 sizeof(a); //值为4,等价于sizeof(int) sizeof a; //值为4 sizeof(4); //值为4,等价于sizeof(int),因为2的类型为int sizeof(3 + 3.1415); //值为8,等价于sizeof(double),因为此表达式的结果的类型为double char array[sizeof(int) * 10]; //OK,编译无误
3.基本数据类型的sizeof
这里的基本数据类型是指int, short, long, float, double这样的简单内置数据类型。
由于它们的内存大小是和系统相关的,所以在不同的系统下取值可能不同。
4.结构体的sizeof
结构体的sizeof涉及到字节对齐问题。
字节对齐的细节和编译器的实现有关,但一般需要满足以下三个准则:
(1). 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
(2). 结构体的每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节。
(3). 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员加上填充字节。
空结构体(不含数据成员)的sizeof值为1struct S1 { char a; int b; }; sizeof(S1); //值为8,字节对齐,在char之后会填充3个字节。 struct S2 { int b; char a; }; sizeof(S2); //值为8,字节对齐,在char之后会填充3个字节。 struct S3 { }; sizeof(S3); //值为1,空结构体也占内存
5.联合体的sizeof
结构体在内存组织上是顺序式的,联合体则是重叠式的,各成员共享一段内存,所以整个联合体的sizeof也就是每个成员sizeof的最大值。union u { int a; float b; double c; char d; }; sizeof(u); //值为8
6.数组的sizeof
数组的sizeof值等于数组所占用的内存字节数。
(1). 当字符数组表示字符串时,其sizeof值将"/0"计算进去。
(2). 当数组为形参时,其sizeof值相当于指针的sizeof值。char a[10]; char n[] = "abc"; printf("sizeof(a) = %d ", sizeof(a)); //数组,值为10 printf("sizeof(n) = %d ", sizeof(n)); //字符串数组,将"/0"计算进去,值为4void func(char a[3]) { int c = sizeof(a); //c = 4,因为这里a不在是数组类型,而是指针,相当于char *a。 } void funcN(char b[]) { int cN = sizeof(b); //cN = 4,理由同上。 }
7.指针的sizeof
指针是用来记录另一个对象的地址,所以指针的内存大小当然就等于计算机内部地址总线的宽度。
在32位的计算机中,一个指针变量的返回值必定是4。
指针变量的sizeof值与指针所指的对象没有任何关系。char *b = "helloworld"; char *c[10]; double *d; int **e; void (*pf)(); sizeof(b); //指针指向字符串,值为4 sizeof(*b); //指针指向字符,值为1 sizeof(d); //指针,值为4 sizeof(*d); //指针指向浮点数,值为8 sizeof(e); //指针指向指针,值为4 sizeof(c); //指针数组,值为40 sizeof(pf); //函数指针,值为4
8.函数的sizeof
sizeof也可以对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。
对函数求值的形式:sizeof(函数名(实参表))
注意:
(1). 不可以对返回值类型为空的函数求值
(2). 不可以对函数名求值
(3). 对有参数的函数,在用sizeof时,需要写上实参表#include float FuncP(int a, float b) { return a + b; } int FuncNP() { return 3; } void Func() { } int main() { printf("sizeof(FuncP(3, 0.4)) = %d ", sizeof(FuncP(3, 0.4))); //OK,值为4,sizeof(FuncP(3,0.4))相当于sizeof(float) printf("sizeof(FuncNP()) = %d ", sizeof(FuncNP()) ); //OK,值为4,sizeof(FuncNP())相当于sizeof(int) /*printf("sizeof(Func()) = %d ", sizeof(Func())); //error,sizeof不能对返回值为空类型的函数求值*/ /*printf("sizeof(FuncNP()) = %d ", sizeof(FuncNP())); //error,sizeof不能对函数名求值*/ return 0; }
两个好消息!一个来自于华为,另一个来自于小米不知道大家还记不记得任正非曾经说过,华为就算没有了供应,但华为的专利费依旧可以养活华为,因为华为真的有这个实力。不过就目前来看,华为好像也并没有对西方国家收取任何费用,而是一心在科
乌克兰央行宣布限制购买比特币以防止资本外逃智通财经APP获悉,周五,乌克兰央行宣布对比特币的购买进行限制,以防止资本外逃。报道指出,乌克兰国家银行禁止使用格里夫尼亚(乌克兰货币)购买比特币,并将每月使用外币购买比特币的上限
实现连续八连冠1月份,比亚迪以92926辆的成绩再夺新能源乘用车销冠,实现连续八连冠。要论及其当下最热门的车,当属DMi超级混动系统加持的车型。秦PLUSDMi于2021年3月8日上市,提供纯电
每个月月租41元,流量10000G的5G随身WIFI真的可以用吗?前几天,我偶然地从抖音上刷到一名主播介绍5G随身WIFI。不管你在青藏高原,还是在其它偏僻的地方,都能连上5G的信号我被她这句话深深震惊住了。刚开始我觉得不可能,因为从手机信号来看
绿色转型稳步推进来源经济日报中国经济一季报亮点原标题绿色转型稳步推进今年一季度,我国绿色低碳产品消费增长较快,新能源汽车太阳能电池产量分别增长140。8和24。3。清洁能源消费占比继续提升,天然气
聊聊华为matexs2,4月28日发布余承东近日在微博官宣,华为将在4月28日召开发布会,发布第5款折叠手机华为matexs2。从后缀可以看出这款手机会是华为matexs的后续发展型。我本想用改良升级四个字,但华为最近
网商银行暂停支付宝提现,支付业务便捷性不受影响近日,网商银行一则公告引发广泛关注。公告称,2022年4月21日起,网商银行逐步暂停支付宝余额提现或转入网商银行类账户相关业务,同时网商银行类账户仅支持本人绑定银行账户转入。根据网
奈飞流失及CNN破产流媒体还是投资好标的吗?似乎没有哪家流媒体服务能彻底拴住消费者的心!经过多年的高速增长,奈飞的新竞争对手给了消费者更多的选择,让投资者怀疑是否会有一个大赢家!奈飞公司连续第二个毁灭性的季度预测本周重创了该
美股大跌!道指跌近千点谷歌跌4。15中新经纬4月23日电北京时间4月23日早间,美股三大指数大跌。道指跌2。82报33811。4点,跌近千点标普500指数跌2。77报4271。78点纳指跌2。55报12839。29点
为什么美团骑手的收入越来越低,就是因为这个有电动第二个车就能跑,自由自在,想工作就工作的美团!为什么到了现在骑手的收入越来越低呢?第一个原因肯定是美团资本主义发作,眼红骑手的收入!拼命压低骑手的单价,以及疫情的原因导致骑手
比亚迪复盘比亚迪002594全名比亚迪股份有限公司。新能源整车动力电池龙头,中国新能源汽车技术综合实力第一。于20110630上市。曾用简称无。位于广东省深圳市。发行价格18。00元,市盈率