C语言关键字深度解剖{staticsizeof}
Posted .阿Q.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言关键字深度解剖{staticsizeof}相关的知识,希望对你有一定的参考价值。
写在前面:
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
本书基于《C语言深度解剖 - 程序员面试宝典》一书,结合自身知识的不足,系统地整理出所学重要的、不熟悉的重难点知识;做到以书为主线,重点多讲,难点深讲。(๐॔˃̶ᗜ˂̶๐॓)(๐॔˃̶ᗜ˂̶๐॓)🎶🎶🎶🎶🎶🎶🎶🎶🎶🎶🎶🎶
取其精华去其不足,深入细致地剖析C语言知识,结合我自身的实际,整理一些不常见的知识点,争取C语言学的更加扎实,严谨!
🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤🐱👤文章仅记录自己所不熟知的内容,其他内容在pdf课件见( 常看!! )
一、static
写在前面:
1.多文件交互
首先来看这个例子,我们直接在main.c文件中,引用show( )函数可以吗?
——————————————程序不会报错,但是会有warning:show未定义! 其实我们知道是因为在main.c中并没有定义
我们再来继续看,在test.c中定义了g_val,在main.c中能否直接引用?
————————————显而易见,程序红线报错,表明g_val并不能使用——>那是因为我们在main.c中没有声明g_val变量
解决方案:在main.c文件中声明变量
————————用extern + 类型 + 该变量名 即可正常使用test.c文件中的变量
那么我们再看,能否extern声明变量的时候,这样写呢? extern int g_val = 100;即:再次写了g_val = 100??
———————————————————— 不行的,这样写就违背了extern声明变量的规则:
因为extern仅仅是用来声明,而不是开辟空间! extern int g_val = 100;中的g_val = 100就是赋值或者初始化,是开辟空间了的,
总结:所有变量声明的时候,都不能赋值。
那么目前这样写,虽然能够正常运行,但是仍旧是不规范的!
——————————————————因为我们没有在main.c文件中定义show()函数!
引出 ——> 头文件的使用!( 为什么使用? )
那么我们程序就可以改写为:
那么问题来了,我们声明变量/函数的时候,需不需要带上extern呢??
——————————————其实是需要的,但是,不带上也不会报错!
————————————————我们规定(不成文的),变量声明必须带上extern:因为在如果直接写int g_val;在编译器看来,是有二义性的——> 这是个变量的声明?还是定义? 虽然系统会给我们默认成声明,但是对我们程序员来说,带上extern会更好!
函数声明建议带上extern:因为函数究竟是定义还是声明取决于有没有函数体,直接写成void show();编译器检测到分号,而没有检测到函数体,就会认为是函数的声明,所以带不带extern,都可以;但是为了程序员的方便看,建议还是带上extern!
规范版本:
2.static
讲了多文件交互,我们就引出了static
先思考两个问题?——1.变量可以跨文件访问吗? 2.函数可以跨文件访问吗? 为什么可以??
————————可以!!
结论1 变量用static修饰的 效果:
—————— 链接式错误
static修饰全局变量/ 函数:
仅允许在本文件被访问,不能被外部其他文件直接访问 ————> 封装函数中的一些方法,只提供一个接口
为什么要用static修饰?
————————在项目中,我为了维护自己的代码,防止被别人盗取,或者买来代码占为己用,我们用static修饰函数,让它仅仅允许在本文件调用,就可以起到一个很好的保护自己代码的作用——>客户想用,不用看了那么多接口不知道用哪个 ,而封装以后就可以仅有一个接口,用来实现想要的效果就可以了;外包公司想用你的代码,那么不用把源代码我不想给他的代码(自己写的,但是不想给他;不然我怎么赚钱??——> 卖菜品,不卖配方!),那么我就可以用static来修饰方法(函数),在本文件封装成一个函数去调用,把此封装好的函数给外包公司即可!(让他不能直接访问我的不想透露的函数,而访问封装好的不用static修饰的函数(间接访问!))
static修饰局部变量:
思考下面结果会是什么??
——————— 打印了10个1。
—————————————————————— 因为i是局部变量,局部变量具有临时性,函数调用开辟空间并初始化;函数结束释放空间。
—————— 那么如何才能打印出1,2,3,4,5,......10呢??
—————————————— 只需要把i变成static修饰的局部变量
static修饰局部变量,更改局部变量的生命周期 临时变量 ——> 全局生命周期
—————————— 我们来写代码验证一下
总结:
不要糊涂了啊!!我们来看个代码试一下你是不是糊涂了!!下面代码为何报错?
————————a的确是static修饰的局部变量,那么a的生命周期就变成了全局的 但是,既然是static修饰的,那么它的作用域是不变的,只在本代码块有效!
static修饰的局部变量与普通局部变量区别:
普通局部变量——>栈区
static修饰的局部变量——>全局数据区
即:static修饰的局部变量,把普通局部变量的临时性 ——> 全局数据区( 即:在整个进程运行生命周期内,都是有效的 )
注意:栈区和堆区是相对而生的。( 互相都是有限的 )
二、变量定义
三、变量命名规则
推荐使用的
好习惯:
尽量不用:
大小驼峰命名规则
命名规则总结:
三、sizeof
不是函数,是关键字或者操作符
sizeof不计算表达式
打印结果是4,0
为什么呢??
————————sizeof是在编译期间计算类型开辟空间大小;而表达式的运算是在运行期间完成的
————————所以,编译早于运行,即:sizeof(s = a + 4);<==> sizeof( s ); 即:没有进行表达式的运算(编译早于运行,所以表达式没来得及计算)。 int类型大小是4,所以打印4
————————第二个打印的是s的值,故是 0
以上是关于C语言关键字深度解剖{staticsizeof}的主要内容,如果未能解决你的问题,请参考以下文章