初识C语言-基本概念讲解

写在最前
比特C语言学习笔记,B站搜索比特鹏哥C语言讲的十分好的老师!本笔记主要来自鹏哥的讲义和图片!本笔记主要用于初学者教学为目的,不用于商业用途,如有侵权,请告诉我删除!
1. 什么是C语言?
C语言是一门通用的计算机编程语言,广泛应用于底层开发 。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准 。2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言最常用的标准 。
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言不同,其主要编译器由Clang,GCC、WIN-TC、、MSVC、Turbo C等 。
一般没啥用,就是提一嘴,免得感觉少点什么 。嘿嘿!
第一个C程序
#include //引用标准输入输出函数 。就是借用一下别人的代码int main()//main函数是整个程序的入口,一个程序有且仅有一个main函数 。高中数学的有且仅有出现了,划重点,要考!!!{printf("Hello,world!");//输出语句 。把双引号内的东西在显示器上显示出来return 0;//返回语句 。返回给操作系统的,咱新手先别管 。}
2. 数据类型
char//字符数据类型//存字符的short//短整型//存小一点的数的int//整形//存大小普通点的数的,一般经常使用的是这个long//长整型//比int存的数大点long long //更长的整形//更大点float//单精度浮点型//存小数的double//双精度浮点数//存小数点位数很多的数的
3. 变量、常量
顾名思义,变量是会变化的量,如年龄,日期等 。
常量是不会变化的量,如性别,身份证号等 。
3.1 定义变量的方法
数据类型 变量名;或数据类型 变量名 = xxx;
int age = 20;float weight = 65.2f;char ch = 'd';
3.2 变量的分类
全局变量
局部变量
#include int global = 2022;//全局变量int main(){int local = 2021;//局部变量int global = 2020;//局部变量printf("global = %d\n", global);return 0;}
结论:局部变量可以和全局变量同名,当两种变量同名的时候,局部变量优先使用 。
3.3 变量的使用
#include int main(){int a;int b;int sum = 0;scanf("%d %d", &a, &b);//从键盘获取输入的一个函数 。就是让你把内容通过键盘敲给电脑 。sum = a + b;printf("sum = %d\n", sum);return 0;}
3.4 变量的作用域和生命周期 3.4.1 作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效的 。
而限定这个名字的可用性的代码范围就是这个名字的作用域 。
1.局部变量的作用域是变量所在的局部范围 。
2.全局变量的作用域是整个工程 。
其实作用域就是我的变量在哪个范围内可以使用 。
3.4.2 生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段 。
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束 。
2.全局变量的生命周期是:整个程序的生命周期 。
你可以想象,你的变量在计算机内存中存储,但是在你整个程序中你并不会一直用它,只有在用它的时候给它一点空间,完事以后丢掉就行 。举个例子:你去外出逛gai,你带了一个包,包里的空间是一定的,装充电器啊,雨伞啊什么的,但是今天是晴天,你用不到雨伞(当然太阳伞当我没说,嘿嘿),你出门的时候就不用带着雨伞,当下雨的时候,你再带上雨伞 。这样一来呢你的包包不会很满很重,二来呢你又不会被雨淋湿 。
3.5 常量
C语言中的常量和变量的定义形式有所差异 。
C语言中的常量分为以下几种:
1.字面常量2.const修饰常变量3.#define定义的标识符常量4.枚举常量
#include //举例enum Sex{MALE,FEMALE,SECRET};//括号中的MALE,FEMALE,SECRET是枚举常量int main(){//字面常量演示3.14;//字面常量1000;//字面常量//const 修饰的常变量const float pai = 3.14f;//这里的pai是const修饰的常变量pai = 5.14;//是不能直接修改的!//#define的标识符常量 演示#define MAX 100printf("max = %d\n", MAX);//枚举常量演示printf("%d\n", MALE);printf("%d\n", FEMALE);printf("%d\n", SECRET);return 0;}
总结:1.枚举常量的默认是从0开始的,依次向下递增1 。2.const是C语言的一个关键词,用来修饰变量,作用之一是让变量不可变 。
4.字符串+转义字符+注释 4.1 字符串
"hello world!\n"
这种由双引号引起来的一串字符称我为字符串字面值,或者简称字符串 。
注:字符串的结束标志是一个 \0 的转义字符 。在计算字符串长度的时候 \0 是结束标志,不算作字符串的内容
#include //下面代码,打印结果是什么?为什么?(突出'\0'的重要性)int main(){char arr1[] = "hello";char arr2[] = {'h', 'e', 'l','l','o'};char arr3[] = {'h', 'e', 'l','l','o', '\0'};printf("%s\n", arr1);printf("%s\n", arr2);printf("%s\n", arr3);return 0;}
4.2 转义字符
假如我们在屏幕上打印一个目录:c:\code\test.c
应该如何打印?
printf("c:\code\test.c");//这个?printf("c:\\code\\test.c");//这个!
下面看一些转义字符
5. 注释
1.代码中有不需要的代码可以直接删除,也可以注释掉
2.代码中有些代码比较难懂,可以加一些文字进行注释
3.注释在编译过程中不会被计算机编译,从而影响运行速度 。
注释有两种风格:
1、C语言注释风格:
/* */
2、C++注释风格:
//
6. 选择语句
如果你认真学习:
如果你不好好学习:
哈哈哈哈哈,一个假例子 。
C语言中的选择语句:
if(选择){}else{}
#include int main(){int c;printf("好好学习嘛?(选择1 or 0)");scanf("%d", &c);if(c == 1){prinf("啊对对对!\n");}else{printf("啊错错错!\n");}return 0;}
7. 循环语句
有些事必须一直做,比如说吃饭:
A:你吃了嘛?
B:吃了!
A:吃了你就再去吃点!
C语言中实现循环的语句:
while语句;for语句;do...while语句
//while循环的实例#include int main(){printf("吃了嘛?(1/0)\n");int c;scanf("%d",&c);while(1 == c){printf("吃了你就再去吃点!\n");}return 0;}
8. 函数
#include int main(){int a;int b;int sum = 0;scanf("%d %d", &a, &b);sum = a + b;printf("sum = %d\n", sum);return 0;}上述代码,写成函数如下:#include int Add(int x, int y){return x+y;}int main(){int a;int b;int sum = 0;scanf("%d %d", &a, &b);sum = Add(a, b);printf("sum = %d\n", sum);return 0;}
函数的特点就是简化代码,代码重复使用 。
想象一下,你每天都要上课,听老师讲老长老长的课,但是有一个东西,可以让你不用每天都上课,只是在上课的时间,用到它,你就可以直接跳过上课,同时你又会知道课上的知识点和内容,是不是很心动?哈哈哈哈,不可能!水与躺轮回不止,这节水,下节躺[手动滑稽]
9.数组
前面说到,一个变量可以存放一个值,但是要存放100个呢?1000个呢?个呢?!!!
那么C语言中就给出了数组的定义:一组相同类型元素的集合
9.1 数组的定义
int a[10] = {1,2,3,4,5,6,7,8,9,10};
这句代码定义了一个存放十个整数类型变量的数组 。
9.2 数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的 。
数组可以通过下标来访问 。
如上句代码,数组a[10]的1 ~ 10这些元素的下标是0 ~ 9 。
9.3 数组的使用
#include int main(){int i = 0;int a[10] = {1,2,3,4,5,6,7,8,9,10};for(i=0; i<10; i++){printf("%d ", a[i]);}printf("\n");return 0;}
10. 操作符
讲解操作符的篇幅比较大,后面会有独立的模块,这里先介绍一下 。
算术操作符:+ 加法- 减法* 乘法/ 除法% 取模//就是两数相除取余数的意思移位操作符:>>右移操作符<<左移操作符这两个的作用是对01串进行移位,后续详解位操作符:&按位与|按位或^按位异或~按位取反赋值操作符:=赋值号+=-=*=/=&=|=^=>>=<<=这些符号都是复合而来的,后续详解单目操作符:!逻辑反操作-负号//不同于减号+正号//不同于加号&取地址符sizeof操作数的类型长度//以字节为单位~对一个数的二进制位按位取反//0和1互变--//这个符号有前置和后置区分,后续详解++//这个符号同--符号*间接访问操作符//解引用操作符,指针章节使用,后续详解(类型)强制类型转换//C语言有很多类型,这个是专门用来转换数据类型的关系操作符:>大于>=大于等于<小于<=小于等于!=不等于==等于//C语言中用这个符号作为数学上的等号,区别于‘=’逻辑操作符:&&逻辑与//高中数学中的‘且‘||逻辑或//高中数学中的’或‘!逻辑非//高中数学中的’非‘条件操作符:exp1 ? exp2 : exp3这是C语言中位移一个三目操作符,它的用处是判断表达式1对不对,如果对,执行表达式2,如果不对,执行表达式3.下标引用、函数调用和结构成员[]().->
11. 常见关键字
autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile
关键字继续介绍几个常用的,不常用的后续遇到再说 。
11.1 关键字
是type 的缩写,顾名思义就是类型定义,这里应该理解为类型重命名 。
比如:
typedef int hahahaint main(){int a;hahaha b;return 0;}
此时a和b的类型是一样的,都是int
11.2 关键字
在C语言中,可以用来修饰变量和函数 。
1、修饰局部变量,称为静态局部变量
2、修饰全局变量,称为静态全局变量
3、修饰函数,称为静态函数
11.2.1 修饰局部变量
//代码1#include void test(){int i = 0;i++;printf("%d ", i);}int main(){int i = 0;for(i=0; i<10; i++){test();}return 0;}//代码2#include void test(){//static修饰局部变量static int i = 0;i++;printf("%d ", i);}int main(){int i = 0;for(i=0; i<10; i++){test();}return 0}
对比代码1和代码2,可得:
static修饰局部变量改变了变量的生命周期,让静态局部变量出来作用域依然存在,到程序结束,生命周期才结束 。
11.2.2 修饰全局变量
//代码1//add.cint g_val = 2018;//test.cint main(){printf("%d\n", g_val);return 0;}//代码2//add.cstatic int g_val = 2018;//test.cint main(){printf("%d\n", g_val);return 0;}
上述两个例子是说,比如我们在一个程序中同时打开了add.c和test.c两个源文件,代码1中表示第一个全局变量没有经过修饰,则在test源文件中可以使用,而代码2中的全局变量经过了修饰,则会在编译的时候出现连接性错误 。
总结:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用 。
11.2.3 修饰函数
//代码1//add.cint Add(int x, int y){return c+y;}//test.cint main(){printf("%d\n", Add(2, 3));return 0;}//代码2//add.cstatic int Add(int x, int y){return c+y;}//test.cint main(){printf("%d\n", Add(2, 3));return 0;}
代码1会正常运行,但是在代码2中会出现连接性错误
总结:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用 。
12. #定义常量和宏
//#define定义常量#define N 250//#defien定义宏#define ADD(x,y) ((x)+(y))#include int main(){int sum=ADD(3,3);printf("sum = %d\n",sum);printf("%d",N);return 0;}
C语言有个不成文的规定,就是常量尽量用大写来表示 。#define做到的一般只是文本替换 。
13. 指针
很多老师为了突出自己学识渊博,自己很吊(bushi),经常拿指针吓唬萌新,然后就好多人对指针很畏惧,其实没必要,因为期末根本考不到(bushi),哈哈哈哈哈哈 。其实指针也不是很难,下面就粗略说一下吧,后续还会精修 。
13.1 内存
内存是电脑上特别重要的储存器,计算机中的程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小小的内存单元,每个内存单元的大小都是1字节 。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址 。
举个例子,你是一家酒店的负责人,你的收入都是来自于酒店房间,所以酒店房间就很重要,然后你为了达到收益最大化,你要给每间房屋进行编号,然后还要注意它们是否被客人入住,内存也就是这个道理啦 。
#include int main(){int num = 10;#//取出num的地址//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)printf("%p\n", &num);//打印地址,%p是以地址的形式打印return 0;}
那么问题来了,地址我们应该怎么存储?
这就用到了指针 。
int num = 10;int *p;//p为一个整形指针变量p = #
这里需要注意一个点就是:指针类型的定义要和所存储地址对象的类型要相匹配,后续会讲解为什么 。
13.2 指针变量的大小
#include //指针变量的大小取决于地址的大小//32位平台下地址是32个bit位(即4个字节)//64位平台下地址是64个bit位(即8个字节)int main(){printf("%d\n", sizeof(char *));printf("%d\n", sizeof(short *));printf("%d\n", sizeof(int *));printf("%d\n", sizeof(double *));return 0;}
总结:指针大小在32位平台是4字节,64位平台是八字节 。
14. 结构体
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型 。
通俗一点就是说,因为C语言有那么多的类型,但是数组又只连续存储相同类型的东西,所以就有结构体,结构体可以存储不同类型的东西 。
比如描述一个学生,学生包含:名字,年龄,性别,学号这几项信息 。
struct stu{char name[20];//存放名字int age;//存放年龄char sex[5];//存放性别char id[15];//存放学号};
结构体的初始化:
【初识C语言-基本概念讲解】//打印结构体信息struct Stu s = {"张三", 20, "男", "20180101"};//.为结构成员访问操作符printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id);//->操作符struct Stu *ps = &s;printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id);