C语言初学学习笔记五

hello!这里是C语言初学小白,我会在这里分享我的C语言学习笔记五。因为开学所以托更了,笔记会不定时更新,感谢观看。

学习笔记四中简单介绍了操作符,接着我们来简单了解一下常见的关键字。

C语言提供的关键字:1.C语言提供的,不能自己创建关键字      2.关键字不能做变量名

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

常见关键字

auto   break  case  char  const  continue  default  do  double  else  enum   extern  float  for  goto  if  int   long  register  return  short   signed  sizeof  static  struct  switch  typedef  union  unsigned  void  volatile  while  

简单了解一下这些关键字。

auto是自动的,每个局部变量都是auto修饰的。

创建局部变量a,看到在第六行a进到大括号开始创建,出第八行销毁。所以对a来说是自动创建,自动销毁的。所以它是自动变量,在局部变量的前面本身都要带auto。因为局部变量都是带auto的,所以把auto省略掉了。auto在新的C语言语法中有其他的用法,暂时不考虑。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

关键字do在do......while语句中讲过,enum在枚举常量中讲到过,char,double,float,int,long,short在讲数据类型中提到过,这里不做详细介绍。

extern是用来申明外部符号的。

for循环,goto语句,if语句

register叫寄存器关键字,这个关键字创建的变量建议存放在寄存器中。

那么为什么要把数据存放在寄存器中?我们来了解一下。

计算机中数据可以存储到哪里呢?

数据可以存放在网盘、硬盘、内存、高速缓存、寄存器中。 

网盘因为依赖于网络,所以传输速度慢,而硬盘的传输速度比网盘要快,内存读写数据比硬盘更快所以它的造价也就更高,技术含量也更高。那再往上,高速缓存比内存的传输速度更快,寄存器又要比高速缓存快。那这个时候在计算机中就形成了一种存储的类似金字塔的结构。越往上,造价越高,速度越快但是空间越小。像大量的,频繁的被使用的数据,想放在寄存器中,就可以提高效率。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

关键字signed是有符号的,像10,-20都是有符号的数字,与之相对应的是关键字unsigned无符号的,它定义的某些关键字是没有符号的概念的。

sizeof求大小,static静态的,后面详细讲。struct结构器,switch语句,typedef类型定义,union联合体或共用体,void无或者空的意思,while循环。我们要对哪些是关键字哪些不是有印象。

那像define,include是不是关键字呢?不是,它们是预处理器并不是关键字。

接下来详细介绍几个关键字。

关键字typedef

类型重定义,如下图,我们定义num变量的类型为unsigned int写起来不方便,能不能把这个类型简化一下,就要用到typedef关键字,我们重定义u_int为unsigned int,这样只要写u_int定义就和unsigned int的效果是一样的。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

关键字static - 静态的

1.static修饰局部变量   

2.static修饰全局变量 

3.static修饰函数

static修饰局部变量

如下图一,我们用while循环,创建一个变量i,让它循环10次,每次循环都调用一个test函数,在函数里面创建局部变量a,打印变量a的值。那我们的打印结果会是什么呢?我们打印一下,看到结果如下图二,打印结果为十个二。我们来分析一下,首先代码从主函数第一行先走,到while语句中,然后到调用函数test中,进到函数里面,a是局部变量,局部变量的特点是进入到其范围里面a创建,出了范围,a自动销毁,所以这里a++就是2。然后a出来自动销毁,下一次主函数重新走一遍,然后代码走到test函数中再次新建一个a,a++为2,一直这样循环十次,打印出来的就是十个2。那我们再用static修饰局部变量a。我们可以看到如下图四的打印结果是2~11,这次为什么得到的是2~11。代码重新走起来,先从主函数进入到test函数中,static修饰局部变量a,使得a出去之后不会销毁。那么这一句static int a=1;再下一次就没有作用了,就是a++,然后下一次进入循环的就是a++之后的值,以此类推,就得到打印结果为2~10。可以看出static修饰之后局部变量出范围之后不销毁,使得局部变量的生命周期变长。我们就可以总结出static修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型)。

内存在学习计算机语言中,会把内存分为几个区域,分别为栈区,堆区,静态区。栈区里面存的是局部变量,函数的参数,只要是局部的,临时的变量都存放在栈区中。堆区是用来动态内存分配的。静态区存两种值,一种是全局变量,另一种是static修饰的静态变量。

那我们局部变量a一开始是放在栈区的,当被static修饰时就放在了静态区。所以a本质上就是从栈区变成了静态区,改变了存储类型。因为存在不同区域内,数据就有不同特点,静态区我们可以看到全局变量的生命周期非常长,只要程序不结束,变量就不会销毁。静态变量和全局变量的生命周期都是一样的。

图一

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

 图二

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

 图三

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

图四

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

static修饰全局变量

再创建一个源文件,再一个源文件中创建一个全局变量,如下图一,在另一个源文件中打印全局变量,用extern声明就可以打印。extern是用来声明外部符号的,只要声明名字和类型。那我们加上static修饰全局变量,如图二打印结果会报错。无法解析外部符号,说明static修饰全局变量,使得这个全局变量只能在自己所在的源文件(.c文件)中使用,其他文件不能使用。

全局变量,在其他源文件内部可以使用,是因为全局变量具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就不能链接到这个静态的全局变量了。

图一

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16图二

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16static修饰函数

static修饰函数和static修饰全局变量是类似的,如图一创建一个Add函数在一个源文件中,另一个源文件引用该函数,用extern声明,发现是可以打印的。当Add函数被static修饰,就会发现无法解析,如下图二。

static修饰函数,使得函数只能在自己所在的文件内部使用,不能在其他源文件内部使用。

本质上:static是将函数的外部链接属性变成了内部链接属性。(和static修饰全局变量一样)。 

图一

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16图二

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16#define定义常量和宏

define是一个预处理指令。

1.define定义标识符常量

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

 2.define定义宏

用define定义一个宏Add,如图一,用2和3分别对应x和y,那加起来一打印可以看到打印结果为5。那这个时候我们在Add(2,3)前面乘以4,打印结果是20吗?如下图二我们可以看到打印结果为11,因为宏是可以替换的,在这里替换成了4*2+3就是11,而不是4*5。那我们要怎么得到20这个结果呢?宏在书写的时候不应该把x和y想成普通的变量,而应该当成表达式来写。所以我们要把它们都括起来。如下图三的写法。这里宏就不再继续详细讲了。

图一

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

图二

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

图三

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rSb6Jav,size_20,color_FFFFFF,t_70,g_se,x_16

 好了,以上就是我的C语言初学学习笔记五,感谢观看。

 

 

 

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值