首页 >> 大全

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

2023-12-13 大全 21 作者:考证青年

写在最前

比特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. 常见关键字

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

关键字继续介绍几个常用的,不常用的后续遇到再说。

11.1 关键字

是type 的缩写,顾名思义就是类型定义,这里应该理解为类型重命名。

比如:

typedef int hahaha
int 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.c
int g_val = 2018;
//test.c
int main()
{printf("%d\n", g_val);return 0;
}
//代码2
//add.c
static int g_val = 2018;
//test.c
int main()
{printf("%d\n", g_val);return 0;
}

上述两个例子是说,比如我们在一个程序中同时打开了add.c和test.c两个源文件,代码1中表示第一个全局变量没有经过修饰,则在test源文件中可以使用,而代码2中的全局变量经过了修饰,则会在编译的时候出现连接性错误。

总结:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。

11.2.3 修饰函数

//代码1
//add.c
int Add(int x, int y)
{return c+y;
}
//test.c
int main()
{printf("%d\n", Add(2, 3));return 0;
}
//代码2
//add.c
static int Add(int x, int y)
{return c+y;
}
//test.c
int 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的地址//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)printf("%p\n", &num);//打印地址,%p是以地址的形式打印return 0;
}

那么问题来了,地址我们应该怎么存储?

这就用到了指针。

int num = 10;
int *p;//p为一个整形指针变量
p = &num;

这里需要注意一个点就是:指针类型的定义要和所存储地址对象的类型要相匹配,后续会讲解为什么。

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];//存放学号
}

结构体的初始化:

//打印结构体信息
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);

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了