【前言】:该篇博文是对初始C语言(上)的补充,内容不多,不过这部分有很多的知识点属于C语言中的重难点,所以小伙伴们好好看看哦。
【声明】:初始C语言部分就是简单介绍一下C语言的大体知识,所有知识点都是点到为止,后面博文中笔者会详细介绍。
在进入正文之前,铁汁们可以将初始C语言(上)再回顾一遍。
初始C语言(上)_theonly_Love的博客-CSDN博客
目录
一.数组
在C语言中要存储1-10的数字,我们该怎样存储呢?
C语言中给了数组的定义:一组相同类型元素的集合。
1.数组的定义
2. 数组的下标
C 语言规定:数组的每个元素都有一个下标, 下标是从0开始的 。
数组可以通过下标来访问的
如图
如果数组是10个元素,下标为 0-9
3. 数组的使用
二.操作符
C语言的运算异常丰富,除了控制语句和输入输出以外的几乎所有的基本操作都为操作符处理。
1.算数操作符
+(加) -(减) *(乘) /(除) %(取余)
这些运算符都是最基础的操作符,不做过多介绍。
在这里需要注意一下容易出错的/和%
- /:在使用/时如果除数和被除数中都没有小数部分则结果只保留整数部分,如:7/2就会为3,而不是3.5 。如果要保留小数部分该怎么办呢?那么除数和被除数中至少要有一个有小数部分,如:7.0/2、7/1.0、7.0/1.0
- %:取模或取余,取两个数相除的余数,注意取模操作符只能应用于整数,如:7%2=1(商3余1)
2.移位操作符
移位操作符有两种:>>(右移操作符)、<<(左移操作符)。
>>为把操作数的二进制位全部右移若干位。右移时,高位(左端)补0;低位(右端)移出部分舍弃。
<<为把操作数的二进制位全部左移若干位。左移时,低位(右端)补0;高位(左端)移出部分舍弃。
将操作数右(左)移时,若低位(高位)移出的部分均是二进制位数0,则每右(左)移1位,相当于除以(乘)2;可以利用右(左)移这一特点代替除(乘)法,右(左)移运算比除(乘)法运算快得多。有些C语言编译程序自动将除(乘)2的运算用右(左)移一位来实现,将除(乘)2^n的运算处理为右(左)移n位。若低(高)位移出的部分包含有二进制位数1,,则不能用右(左)移代替除(乘)法运算。
3.位操作符
& ^ |
这里的“位” 指的是二进制位
按位与&:对应的二进制位有0,则为0,全1才为1;注意与取地址&区分
按位或|:对应的二进制位有1,则为1,全0才为0;
按位异或^:对应的二进制位相同,则为0,相异才为1;
注意:对位操作实际上是对存储在内存上的二进制位进行操作的,然而整数在内存上存储的是其二进制的补码形式,所以对位操作,也就是对二进制的补码进行的操作。
4. 赋值操作符
= += -= *= /= &= ^= != >>= <<=
第一个为赋值操作符,后面全为复合赋值操作符。如:a+=5等价于a=a+1
5. 单目操作符
- ! 逻辑反操作
- - 负值
- + 正值
- & 取地址
- sizeof 操作数的类型长度(以字节为单位)
- ~ 对一个数的二进制按位取反
- -- 前置、后置--
- ++ 前置、后置++
- * 间接访问操作符(解引用操作符)
- (类型) 强制类型转换
单目操作符:操作数只有一个,什么叫操作数呢?比如:2 + 3 --> 2和3就是操作数,由于‘+’有两个操作数,数以叫双目运算符。
!:如果a为真,则!a为假
说明:C语言中用0表示假,非0表示真 ,注意是非0表示真,即使是-1也表示真。
注意:sizeof()是操作符,不是函数!sizeof计算的是类型或者是由类型定义的变量的大小,单位是字节。
~ :按位取反的意思是如果二进制为0则变为1,如果二进制为1则变为0。
++ -- 以前置、后置++为例
前置为先自增再使用,后置为先使用再自增
举个例子
(类型): 强制类型转换操作符将表达式的值转换为所需的数据类型
说明:
(1)类型名和表达式都必须加括号(单个变量可以不加括号)。 例如,“(int)(x+y)” 表 示把x+y的结果转换成int类型,而“(int)x+y” 表示把x转换成int之后再与y相加。
(2)强制转换不改变数据说明时对该变量定义的类型。例如,"(double)a" 只是将变量a的值转换成一个double型的中间量,a的数据类型并未转换成double型。
6. 关系操作符
- >
- >=
- <
- <=
- != 用于测试“不相等”
- == 用于测试“相等”
7. 逻辑操作符
&& 逻辑与---“并且” 全为真才为真,如 a && b 注意&&与&(取地址操作符或位操作符)区别开
|| 逻辑或---“或者” 有一个为真就为真 ,如 a || b
8. 条件操作符
exp1 ? exp2 : exp3
注意exp代表的是表达式,后面还会提到。
条件运算符,又称为三目运算符,表达式1为真,则计算表达式2的值,跳过表达式3,也就是说表达式2的结果就是整个表达式的结果;反之,若表达式1为假,跳过表达式2,直接计算表达式3的值,也就是说表达式3的结果就是整个表达式的结果。
9. 逗号表达式
exp1,exp2,exp3...expN
注意:逗号表达式会从左向右依次计算,整个表达式的结果是最后一个表达式的结果
10.下标引用、函数调用和结构成员
[ ] () . ->
三.常见关键字
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
注意:关键字先暂时简单介绍两个,后面会详细介绍
- 关键字不能自己创建
- 关键字不能作为变量名
1. 关键字typedef
typedef关键字顾名思义是类型定义,这里理解为类型重命名。
举个例子
2. static关键字
在C语言中,static是用来修饰变量和函数的。
- 修饰局部变量-称为静态局部变量
- 修饰全局变量-称为静态全局变量
- 修饰函数-称为静态函数
(1)修饰局部变量
使用static修饰局部变量将改变变量的生命周期。
讲到这里,简单介绍一下内存空间的区域划分
内存空间可以简单的划分为三个区域:栈区、堆区、静态区。
局部变量是在栈区开辟空间,通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该变量分配栈内存空间。但随着程序退出函数,系统就会收回栈内存空间,局部变量也相应失效。但static修饰局部变量使其在静态区开辟空间,使其每次的值保持到下一次调用,直到下次赋新值,至程序结束系统收回空间。
(2)修饰全局变量或修饰函数
使用static修饰全局变量或修饰函数的作用是相似的都是改变其作用域。
一个工程项目内在不同的源文件之间可以相互调用全局变量或函数,但使用static修饰后则只能在自己本源文件内使用无法外部直接调用(可间接调用),使其作用域改变。
四.指针
1.指针与内存
指针在C语言中可以算是最重要也是最难的一个内容了,这里的难并不是指针本身有多难,而是它几乎可以与C语言中其他所以知识点相结合,从而变得很难。不过铁汁们放心哦,后面笔者会用大量的篇幅去介绍它,这里,简单让大家了解一下。
讲到指针,就不得不讲一下内存。在计算机中内存是特别重要的存储器,计算机中所有程序的运行都是在内存中进行的。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存中的每个单元,就把内存单元进行了编号,这些编号被称为内存单元的地址。
既然在内存中有这样的地址编号,而变量是创建在内存中的(在内存中分配空间的),每个内存单位都有地址,所以变量也是有地址的。
那么一个整形在内存中又是如何存储的呢?
大家请看下面这张图
解释一下,一个整形在内存中占四个字节,其在内存中的存储如图所示。如果要将该变量的地址取出&num,是不会四个地址都取出来,只会取出它的首地址。
那如果我们现在想要存放整形变量a的地址该如何存放呢?
这就引出了指针的概念。在C语言中我们使用指针变量来存放地址。
那么在C语言中指针变量又该如何定义呢?
现在我们知道了指针变量的定义。那么它又有什么用呢?
我们把一个变量的地址存起来有什么用呢?总不能存着玩吧。其实是有用的,在把一个变量地址存起来后,今后我们就可以通过该地址找到它所对应的变量。可以通过指针间接的去改变它所对应的变量的值。
那么该怎么找呢?
当然,有人可能会问了,直接a=20,不好吗,非要搞得这么麻烦,这里笔者只是简单介绍了下指针,让大家理解*pa是什么意思,至于指针真正的应用,笔者以后会详细介绍。
2.指针变量的大小
指针变量的大小是相同的,与它的类型无关,这是为什么?
因为指针存放的是地址的! 指针需要多大空间,取决于地址的存储需要多大空间。
所以在指针在32位平台占4个字节,64位平台占8个字节。
注意编译器上X86代表32位,X64代表64位
五.结构体
生活中总有一些事物无法用一个变量就描述出来。比如一个人就包含了:名字 + 年龄 + 性别 + ...
所以C语言就提供了一种类型叫做结构体,它使得C语言有能力描述复杂类型。
在C语言中使用结构体可以创建出一个新的类型
那么类型创建出来就要拿来使用,注意光有类型是不够的,我们还要拿这个类型创造变量才能使用。
当然我们也可以使用指针的方法来访问
结束语
初始C语言部分到此就结束咯,当中的代码大家都可以敲一敲感受一下哦。感觉有所收获的铁汁们给笔者来个三连吧,感谢喔。