简单认识一点C语言

先简单说明一点

内容比较广,并没有写的那么深,不是为了让大家记住的,留个印象就好,如果觉得比较长就一部分一部分看,记住每次看的进度就行,还有就是我水平也不是那么高,这些都是我纯手打的字,没有功劳也有苦劳,如果有哪些地方错了希望大家嘴下留情
在这里插入图片描述


我相信点进来的各位应该都是稍稍了解了一下C的,那么各位刚入门的同学应该对于hello world这个“东西”都不陌生。

也就是下面这个东西在这里插入图片描述
那么我就先用这个来简单讲一点。。

​一、函数


首先介绍一个东西,叫做函数。(下面这些不要死记硬背,留个印象就可以)

这里的函数可能跟大家印象里的函数不是一个东西,大家印象里的函数基本都是中学阶段的一些东西,比方说什么f(x) = 4x - 6,而编程里的函数是 函数返回值类型+名字+参数+实现函数功能的语句+函数的返回值(由返回值类型决定)。是由一堆字母组成的语句。

什么?你说你看到这里就想放弃了?桥豆麻袋,其实也很好理解,我们可以做一下类比。

在这里插入图片描述

对于中学阶段的函数,就拿f(x) = 4x - 6来说这个函数也可以是由:函数返回值类型+名字+参数+实现函数功能的语句+函数的返回值来组成。

这里的函数名字就是f ,函数的参数就是x ,实现函数功能的语句就是4x - 6 。

当你对中学的这个函数传入一个参数的值时,假如我们传参使得x = 2,那么这时函数的返回值就是4×2 - 6 = 2,那么2就是返回值,对应的是一个int类型(整数类型)。

那么对于我们现在学的函数,也就是这个“hello world”,它的函数的返回值类型为int,函数名就是main,并且这个函数没有参数(函数可以有参,也可以无参),实现函数功能的语句就是printf(“hello world\n”); ,函数的返回值为0。

下面我圈画的东西都是基本上都是函数的一些东西,大家看的时候留个印象就可以。

在这里插入图片描述
对于一个程序,开始执行时必须从主函数开始(就是上面的main函数),当你在编译器里实行调试的时候,开始的第一句话就是主函数名字下面的一行,在这里对应的就是第5行。 一个程序里可以有多个函数,但只能有一个main函数。其他的函数可以是你自己定义的,也可以是库函数(在使用库函数时记得要引对应的头文件,比方说在这里printf就是一个库函数,对应的库函数就是stdio.h)。

以上的东西留个印象,只要记住函数是用来实现某些功能的(比方说打印什么信息,两个数值相加,比大小等等),等到大家学到函数的时候就自然而然地知道了。

​二、数据类型

下面我讲一个东西,叫做数据类型

大家看到这个东西应该能猜出来七七八八,数据类型,也就是数据的类型。

比方说,一个人的性别,比方说男,这里的男就是一个字符类型的数据;再比方说年龄,一个人20岁,这里的20就是整数类型;还有商品的价格等等。

以下的数据类型就是一些基本的数据类型:
在这里插入图片描述

对应的,每一种数据类型都有对应的在内存中所占空间的大小,如下所示
在这里插入图片描述

那么这里的这些数字都指的是什么呢?
在这里插入图片描述
其实这里的数字的单位是字节(byte),一个字节8个比特(bit)位。也就是所占空间大小。

最小的就是bit,再往下就是byte->KB->MB->GB->TB->PB,后面的这些两个相邻的转化时大的对应1024个小的,也就是1KB = 1024byte ,1024 = 2^10,这里大家可以去搜搜看为什么是1KB为什么等于2的十次方个byte,我就不讲那么细了。

用这么多种数据类型就可以表示我们生活中很多的东西(年龄,薪资,体重,)。

三、变量

有了数据类型,就可以创建变量辣。

1.变量的定义

举个栗子:int age = 20;

这里的int就是变量的数据类型 , age就是变量名 , 20就是age的值。

2.变量命名规则

1.只能由字母(包括大写和小写)、数字和下划线( _ )组成。
2.不能以数字开头。
3.长度不能超过63个字符。
4.变量名中区分大小写的。
5.变量名不能使用关键字。

这些要记一记,你们若是大一的计算机新生,考试的时候这东西几乎是必考的(主要记住1,2,4,5 ;3这种情况基本不会出现)。

变量分为局部变量和全局变量

先来看段代码
在这里插入图片描述 别看答案,先自己想一想打印的结果是什么?
在这里插入图片描述

在这里插入图片描述
你答对了吗? 不管答没答对,你知道为啥吗?
在这里要记住一句话:当局部变量和全局变量名字冲突时,局部优先。

这句话很重要,要记住。

3.局部变量和全局变量

简单来讲的话,在我理解里就是函数的大括号内部的就算是局部变量。在函数外定义的就是全局变量。
![在这里插入图片描述](https://img-blog.csdnimg.cn/7d1e9543ac464da3811ff8fe5654134d.png

再比方说这里的num其实都是局部变量,不过有的更加的局部,打印的时候每一个局部打印的就是每一个局部的num。
在这里插入图片描述
这里我又在函数外部添加了一个num,大家根据结果也就能理解局部和全局在打印的时候的区别了。

4.变量的作用域和生命周期

前面也了解了什么是局部变量什么是全局变量,那么就说一个概念作用域

局部变量的作用域是变量所在的局部范围。(我理解的就是局部变量所在大括号的范围)
全局变量的作用域是整个工程。(程序开始到结束都是它的作用域)

再说一个概念生命周期

局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。

5.常量

字面常量
const 修饰的常变量
#define 定义的标识符常量
枚举常量

在这里插入图片描述

四、字符

1.字符串

“hello world\n”,这是一个字符串,由多个字符组成,这里面的字符有

‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ’ ', ‘w’, ‘o’, ‘r’, ‘l’, ‘d’, ‘\n’, ‘\0’

有的同学就可能会有疑问了,里面的’\n’怎么能算一个字符呢,还有为啥后面还有一个‘\0’?
很简单,都是龟腚。
先说’\0’,字符串的结束标志就是\0。不要问我为什么,这是龟腚。

比方说打印字符串的时候,下面这三个字符串的打印结果一样吗?
在这里插入图片描述
如果我这样问了肯定是有猫腻,那么猫腻在哪,先看结果

在这里插入图片描述
可以看到,第一个和第三个打印结果是相同的,而第二个打印的结果出现了乱码的情况。

这是因为在打印第二个字符串时,当打印完hello后,编译器找不到这个字符串的终止标志’\0’,编译器认为你并没有让其停止,于是接着往后找’\0’,等找到了’\0’时,已经打印出了乱码。

printf打印字符串若想停止,则必须找到字符串的终止标志’\0’,找不到就继续打印,如果你定义字符串时并没有将’\0’定义进去,那就会一直打印,直到找到’\0’。
若没听懂,请看下图再结合上述,应该是能懂的。

在这里插入图片描述
还有一个库函数叫strlen,这个函数是用来计算字符串长度的,比方说"hello",这个字符串长度就为5。注意这里strlen计算长度时可不敢把’\0’算进去,这也是龟腚。

2.转义字符

下面说一说这个\n。
大家应该都知道芝士什么,就是打印的时候换行,那么什么一个\加一个n是换行呢。还是龟腚。
这就是转义字符,下面这张表可以帮助大家记忆一下:
在这里插入图片描述
这里面最重要的就是八进制和十六进制的转义字符。

①八进制

‘\ddd’ 可以有1-3位的数,每个位的数字从1到7
举个栗子:‘\250’,这就代表的是一个八进制的数,对应的值就是(2*8^2) +(5*8^1) + (0*8^0) = 168。
再来一个练习一下:‘\45’ , (4*8^1) +(5*8^0) = 37。

这里要注意 ,八进制里每个位的数最大为7,超过7就不是八进制的数了,比方说\138,这里\13是一个八进制后面的8就不是了。

②十六进制

‘\xhh’ ,可以有1-2位的数,每个位的数字从1到f(15)。十进制的单个数字没法直接表示十六进制的单个数字所以当数字大于9时,就用了字母代替:a(10),b(11),c(12),d(13),e(14),f(15)
同样举个栗子:‘\x26’, (2*16^1) + (6*16^0) = 38。

在这里也是要注意最大数字为f

五、代码注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字

这两点要注意

六、选择语句

if语句

很简单不过多赘述:
if(判断条件 )
{
条件成立的语句
}
else
{
条件不成立的语句
}

可以有多个if,还有else if, switch 等等,这里只是为了让大家留个印象,就不说那么多了

七、循环语句

1.while语句

whlie(循环条件)
{
条件成立的语句,不断循环,直至条件不成立退出
}

2.for语句

for(变量初始值 ; 循环条件 ; 第一次循环后每次循环先执行的操作)
{
条件成立的语句,不断循环直至条件不成立推出
}

3.do… while语句

do
{
先循环一次
在进行条件判断,条件成立的语句,不断循环直至条件不成立推出
}while(循环条件)

就讲这么多吧,以后了我再专门出一章这个内容。小白留个印象就行。

八、数组

1.数组定义

下面这张留个印象就好
在这里插入图片描述

2.数组下标

数组中的每个元素都有对应的下标,按顺序从0到n-1(假如说数组中有n个元素),比方说有五个元素的话就是从0到4.
在这里插入图片描述
比若说这个数组里的3,对应的下标就是0,需要表示这个元素的时候就是arr[0];对应的2就是arr[1];4就是arr[2]……以此类推。

3.数组的使用

一般用数组的时候要搭配着循环来进行使用。如下:
在这里插入图片描述
这里就是循环5次,讲数组里的数组挨个打印。
就不讲那么细了,以后会专门出数组的。

九、操作符

1.算数操作符

在这里插入图片描述
这里的加减乘都是按照以前学过的知识来的,主要说一下/和%。
先上例子:
在这里插入图片描述
这个百分号其实是取余数的意思,13除以2等于6余1,所以就是1。还要记住就是%两边必须是整数,不能用小数。
这里的除法按照以前学的应该是打印的是6.5,而这里打印的是6,原因很简单。
首先,num在这里是int类型,2也是整数,语法龟腚这里除得的数一定是整数,所以就省去了0.5。所以这里num/2的值就是6。
若想打印出来6.5,有好几种改法
①将打印格式改为浮点型,也就是%d改为%f
②num或2改为浮点数类型,可以有如下改法。

第一种:定义时将num定义为float类型,也就是float num = 13.0f
在这里插入图片描述
第二种:将2改为2.0
在这里插入图片描述
第三种:两个一块改
在这里插入图片描述

也可以用强制类型转换,就是(float)num/2;

2.移位操作符(以后再讲)

在这里插入图片描述

3.位操作符(以后再讲)

在这里插入图片描述

4.赋值操作符(跟上面的有重复的地方,也是以后讲)

在这里插入图片描述

5.单目操作符

在这里插入图片描述
这里面主要是!,sizeof,++,–

先说!:在C语言里,逻辑上只有0为假,其他的都为真。比如说-1也是真。
!在逻辑判断时会很有用

sizeof这个要和前面的strlen分清,对于字符串来说,strlen计长度的时候是不计’\0’的,而sizeof计算大小时是要算’\0’的,例如:
在这里插入图片描述
sizeof计算的是所占内存的大小,strlen计算的是字符串的长度。
记住大小和长度都是不一样的

++(自增)和–(自减)
这个懂一个就全懂了
假如说a = 2 , b = 0 的话

①令b = a++,这是后置++,那么就是先b = a, 再a = a+1;
b就等于2,a就等于3
②令b = ++a,这是前置++,那么就是先a = a + 1 ,再b = a;
b就等于3,a也等于3

剩下的自增自减就都一样了

6.关系操作符

在这里插入图片描述
这里要注意在做等于判断的时候要用两个等号,一个等号是赋值,不是判断相等。小白们尤其注意。

7.逻辑操作符

在这里插入图片描述

&& 两个同时为真,则为真,只要有假则为假
|| 只要有真则为真,两个同时为假才为假

&&只有左右都成立才为1,有一个为0则全为0
在这里插入图片描述
在这里插入图片描述

||只要有一个为真就为真,左右两边都为假时才为假
在这里插入图片描述
在这里插入图片描述

8.条件操作符

exp1 ? exp2 : exp3 , 也叫三目运算符
这里面,exp1成立的话,就为exp2的值,若不成立,就为exp3的值
在这里插入图片描述

9.逗号表达式

(exp1, exp2, exp3, …expN)
注意:运算时,需要从左往右依次计算,每个表达式的值都要算一次,一直算到最后。整个表达式的值是最后一个也就是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 就是用来给数据类型重命名,在以后学到数据结构的时候会非常多见,比方说一个链表或者顺序表重命名:
在这里插入图片描述
这就是一个链表节点的定义,还可以将其中的data(数据)的类型改为别的类型,而且如果更复杂的话可以这样写:
在这里插入图片描述
这里面可以任意改变data的数据类型,可能刚学的你现在听得有点懵,没关系,留个印象即可,以后会学到的。

2. 关键字static

在C语言中:
static是用来修饰变量和函数的

  1. 修饰局部变量-称为静态局部变量
  2. 修饰全局变量-称为静态全局变量
  3. 修饰函数-称为静态函数

那么有什么用呢?

上例子:
对于局部变量而言

在这里插入图片描述在这里插入图片描述

可以看到,当我们在a前加上了static时,结果是截然不同的。
前面我们提到了生命周期这个概念,那么现在需要用到它。

在第一个例子中,int a = 3;这个a在定义的时候只是一个简单的局部变量而已,它的作用域就是test这个函数内部,当每进入一次test,a都会被创建一次,每次退出test时都会将a自动销毁,所以就导致了每次调用test时a都是一个全新的a,根前一次调用没有半毛钱关系。

那么在第二个例子中,static int a = 3;这个a在定义的时候就不是那么简单了,static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。
也就是说这个a只有在程序结束后才会销毁,不会进了函数就创造,退了函数就销毁。所以这个a每次调用之后都会保留前一次的数据,所以就会调用一次函数就加一。

对于全局变量而言
在这里插入图片描述
我在整个程序中创建了两个.c文件,并且在一个.c文件中创建了一个全局变量num,在另一个.c文件中声明了这个全局变量num,那么这时我们就可以在声明的那个.c文件中使用num了。
但是当我加上static后
在这里插入图片描述
这个时候就报了两个错误。
这是因为全局变量本身是具有外部链接属性的,但当我们给全局变量加上了statci修饰后就将外部链接属性改为了内部链接属性,也就是这个时候我们就不能在除了定义该全局变量的.c文件以外的.c文件中使用这个变量了,也就是影响了这个全局变量的作用域。

再来看一下全局函数
先是不带static的:在这里插入图片描述
再来看一下带static的:
在这里插入图片描述
其实这里全局函数跟全局变量原理几乎是一模一样的,我就不过多赘述了,把上面的全局变量的原理记住就好

那么剩余的关键字我会以后再讲,这里就先把static和typedef讲清了就行
身为小白的你应该听懂了吧。

十一、#define 定义常量和宏

1.#define定义标识符常量

标识符常量其实在前面已经提过了,话不多说,直接上例子:
在这里插入图片描述

这里的MAX就是标识符常量。

2.#define定义宏

也是直接上例子
在这里插入图片描述
很简单,不过多赘述。

十二、指针

首先呢,先见识一指针是什么样子的:

int a = 10;//这是一个整数类型变量a
int* pa = &a;//这是一个整数类型指针pa指向了a的地址。

那么有的同学可能对于指针和地址是什么东西比较迷惑,在这里可以先简单记住一点,二者其实是一个东西。指针即是地址,地址即是指针。
想要学好指针,最重要的一点就是要搞清楚内存,很多小白觉得指针很难大概率就是因为没搞清楚内存。

1.内存

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
那么稍微了解一点的同学应该是知道内存四区的这个说法的,哪四区呢:代码区,栈区,堆区,静态区。

代码区:存放函数的二级制代码
栈区: 局部变量,函数的参数,函数的返回值都是栈区变量。
堆区:一般由程序员分配释放,malloc开辟等等
静态区: 存储静态变量(static)和全局变量。

为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

这里的内存其实和我们生活中的楼房是很相似的。

就比如说我们学校的每一栋宿舍楼里面的每一个房间都有对应的门牌号,如果说我想要找到某位同学(在某栋楼的某栋宿舍),我就只需要查出来TA所在的宿舍楼->门牌号即可。
现在我们类比到现在所讲的内存,宿舍楼相当于我们的内存的某一个区,楼里的每一个房间相当于区中的每一个字节(byte)大小的内存单元,那么所有的数据其实就都存放在内存单元中的,只不过有的数据比较大,有的数据比较小(由于数据的类型不同,其所占的空间大小也就不同),所占的内存单元总数不同,这也很好理解,就比方说现实生活中有的人很有钱,可以买好几间房子,而有的人没那么有钱,就只有一间房子可住。那么数据的地址编码就是对应于房间的门牌号。
再给大家讲一下地址是如何生成的:
这就涉及到硬件方面的东西了,每台电脑都对应有32位或64位操作系统,多少位就对应有多少根寻址线,比方说32位操作系统下就有32根寻址线,每一根寻址线都可以通电,电又分为低频和高频,当某一跟线通的是高频时,这根线的二进制表示就是1,同理,通低频时,这根线的二进制表示就是0,这个要留个印象
在这里插入图片描述
而且2的32次方对应的就是4G的大小,64次方对应的就是8G的大小

对于二进制和十六进制的转换,二进制中连续的4位对应于十六进制中的1位。这样用十六进制表示就会非常的方便。

举个栗子,对于十进制中的8,495
在二进制中就表示为 0010 0001 0010 1111
在十六进制中就表示为 2 1 2 F

大家若是不会转换的话可以在网上搜一搜,我就不讲进制转换了。
下面就给大家看一张图来理解一下:
在这里插入图片描述
再给大家看看在编译器上的显示
在这里插入图片描述
蓝色的地方还有一些大小端的知识,我就不讲那么细了,以后会讲。

那么内存在这里就讲这么多,绝对是够用的,希望你能记住这些东西。😊

再看一些东西:
在这里插入图片描述
讲两个符号*和&

先说*
这个符号两个地方可以见到:第一个就是定义一个指针的时候,第二个是使用指针的时候。
定义的时候用到*就说明这个变量是一个指针

比方说int * p = &a;这里的意思就是p是一个整数类型的指针。

使用指针的时候用到*就是解引用的意思

比若说*p = 20;就是解引用p,通过p找到p所指向的变量a,并将其的值改为20;

再说&

这个&就是取地址的意思,&a就是a的地址。

结合上面的int * pa = &a;意思就是定义一个整数类型的指针变量,并将其指向a的地址。

再看一下下面这个例子,你看看你能搞定吗?
在这里插入图片描述

2.指针变量的大小

指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)
这个要牢记
不多说,直接上例子
在这里插入图片描述
全是死记,没有技巧。😁

十三、结构体

这就是最后要讲的东西了,再坚持一下。

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。

比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
或者描述一本书,这本书就包含了:书名,定价,出版商等等
这里只能使用结构体来描述了。
上例子:
在这里插入图片描述

那么结构体也有龟腚的初始化方法和访问操作(使用)。

先说初始化
例子:
在这里插入图片描述

这里在初始化时就对应的是上边的结构体,定义必须一一对应。

再说访问:有两种方法,一是. 二是->
上例子:
在这里插入图片描述

我再整个发出来看一下效果:
在这里插入图片描述

这些都是语法龟腚,记住就行。

那么到这里本章的内容就算完了,大家若果看到有错误的地方可以提,我及时更正。

谢谢你能看到这里,拜拜。😊
在这里插入图片描述

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

先搞面包再谈爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值