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}的主要内容,如果未能解决你的问题,请参考以下文章

想学好C语言这些关键字不能少(深度解剖)

C语言关键字深度解剖{autoregister}

C语言关键字深度解剖{autoregister}

[ 深度解剖C语言 ] 关键字 ---- auto register

以下几个C语言关键字你真的得懂(深度解剖)

超详细的C进阶教程!深度解剖C语言自定义类型