目录
main特点:main函数在一个程序(工程)有且只有一个(不同文件也不行)(下方就是没有注意会出现的问题)
3.1.2每种类型的大小是多少?利用-sizeof()计算一个类型大小的-返回值是size_t-无符号整数
如若一个变量名称冲突(既定义了用来全局变量,又用来定义局部变量,那么他是否会有两个值呢?-不会(非常不建议)
4.4变量的作用域和生命周期-讨论的就是创建、销毁以及能否使用的问题
4.5.4枚举常量-生活中有一些的值是可以一一列举的(如:性别、三原色、星期、月份等)
c语言是一种结构化的语言-顺序、选择、循环结构,因此除了上方的顺序结构,还有选择和循环结构
9.函数(函数可以类比工厂-传参就好像原料,返回值就好像产品)
10.1 定义数组(数组名是arr-定义数组的时候【】中是常量(【常量】)--不绝对-c99标准中引入了变常数组的概念)
11.操作符(编译器识别操作符语义的时候是通过操作数来判断的)
1.!(补:c语言中,0表示假,非0表示真。 !成为零逻辑反操作)把假变真,把真变假
3.sizeof(计算操作数的类型长度(所占空间大小),输入的可以时变量和类型,单位是字节-切记不是函数)编辑
4.++和--操作符(①分前置和后置++②以下只会演示++,--操作符同理)编辑
12.常见关键字-由c语言提供,用户无法创造关键字,且关键字不能用作变量名
①extern(声明外部符号的,用于全局变量和函数(对于局部变量无意义-出了作用域便销毁))
2.static修饰全局变量(本质上是改变了变量的链接属性)(全局变量在任意地方都可以使用,但是要正确的声明和定义-防止其他人使用)编辑
3.static修饰函数(函数本身具有外部链接属性-使用static修饰函数类似于修饰全局变量-防止其他人使用)编辑
既然宏具有两个缺点,那么能否说用函数就一定比定义宏来的好呢?
1.什么是c语言?(发展历程)
C语言是一门通用计算机编程语言,广泛应用于底层开发。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。----------较为广泛的是c89、c90、c99、c11这四个标准。
常见编译器
在今天这个时代,我们写代码都直接使用IDE(集成开发环境=编辑器+编译器+调试器..)软件。
其中编写c语言的编译器主要是GCC和MSVC等。
2.第一个c语言程序
相信以下程序我们在很多c语言入门书籍能够看见
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
那么我们就来了解一下有关这个程序的知识
2.1如何写第一个c语言程序
写c语言代码,首先写出主函数
int main() //-常用
{
return 0;
}
void main() //-老式
{
return 0;
}
//①int-整形
//②其中main()的()中可以不写形参(或者表示为(void)),但是最多可以有三个参数 分别是int argc ,char*argv[]两个命令参数和char *env[]环境变量参数
//③printf是一个c语言提供的库函数-按照特定格式打印输出到屏幕-使用时要包含头文件(相当于借用别人的东西要打招呼)下方的scanf则为输入。
//④stdio.h -std→标准 i→输入 o→输出 .h→头文件
2.2为什么c语言要写main(主)函数?
主函数是程序的入口-从main函数第一行开始执行
main特点:main函数在一个程序(工程)有且只有一个(不同文件也不行)(下方就是没有注意会出现的问题)
3.数据类型![](https://i-blog.csdnimg.cn/blog_migrate/838b9f04bb53bb64f539eed11ec461b8.png)
3.1c语言提供的数据类型
单精度浮点数和双精度浮点数的大体区别
①在内存中单精度浮点数占用4个字节,双精度浮点数占用8个字节
②有效位数不同:单精度浮点数有效位数是8位,双精度浮点数有效位数是16wei
③编译器默认小数是双精度浮点数,如果想改成单精度浮点数,则在小数后面+f(5.5f)
3.1.1为什么会出现这么多类型?
提供丰富的类型,是为了选择适合的类型去更准确的描述生活中的问题
3.1.2每种类型的大小是多少?利用-sizeof()计算一个类型大小的-返回值是size_t-无符号整数
在讲述这个问题之前,我们要先介绍什么是“大小”
计算机的单位是bit,1个bit位可以存放一个二进制的0或1 (单位进制关系如图)
因此如下图:我们可以看到每一个类型对应的大小(单位:字节),此外c语言规定long>=int的大小即可
3.1.3c语言中有没有字符串类型?
既然有"HelloWorld",这样的字符构成的字符串,且有char这种字符类型。
那我们很自然的会想到,字符串常量可以用什么类型的变量来装?
很遗憾,C语言里面没有专门的字符串类型。在C语言中,字符串是被当做字符数组来处理的。
3.2自定义类型-自己创造
如struct结构体,enum枚举,union联合体等待。
4.常量和变量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)
有些值是可变的(比如:年龄,体重,薪资)。
不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。
4.1定义变量的方法
变量类型 + 名字(要有意义-一般和程序实现的内部过程有关)
int age = 150;
float weight = 45.5f;
char ch = 'w';
4.2变量的分类
①局部变量② 全局变量
#include<stdio.h>
int b = 1000;//全局变量 - 定义在大括号的外部(函数)
int main()
{
int a = 100;//局部变量 - 定义在大括号的内部(函数)
printf("a = %d\n", a);
return 0;
}
如若一个变量名称冲突(既定义了用来全局变量,又用来定义局部变量,那么他是否会有两个值呢?-不会(非常不建议)
此外这两个变量是完全不同的变量-地址不同(不是重新赋值)
4.3变量的使用
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2; //定义一个变量存放相加后的值
printf("sum = %d\n", sum);
return 0;
}
4.4变量的作用域和生命周期-讨论的就是创建、销毁以及能否使用的问题
4.4.1什么是作用域、声明周期?
①作用域(scope):是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。
即一个变量哪里可以使用,哪里就是它的作用域。
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。
②生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
4.5常量
4.5.1字面常量
4.5.2const修饰的常变量
①const是一个c语言的关键字
如下的变量是可以修改的
②const -常属性-修饰变量后,变量(具有常属性)就不能再改 (本质上来说变量依旧是变量,只是从语法角度上来说不能再被修改)
如何证明以上的特点?
4.5.3#define定义的标识符常量
4.5.4枚举常量-生活中有一些的值是可以一一列举的(如:性别、三原色、星期、月份等)
因此引入了枚举类型
enum-枚举关键字
5.(对应3.1.3)字符串+转义字符+注释
由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。注:字符串的结束标志是一个\0的转义字符。
在计算字符串长度的时候\0是结束标志,不算作字符串内容。
如何证明字符串的结束标志是‘\0’?
5.1.strlen函数(求字符串函数)![](https://i-blog.csdnimg.cn/blog_migrate/4ff0d2a4801509a4ba4532ef21523c09.png)
5.2转义字符
①\n-回车(先到下一行,再到行首)-具有刷新缓冲区的作用
②%d-打印整形
③%c-打印字符
④%p-打印地址
⑤%s-打印字符串
⑥%(l)f-(双)单精度浮点数
6.注释
1. 代码中有不需要的代码可以直接删除,也可以注释掉
2. 代码中有些代码比较难懂,可以加一下注释文字
一般来说第2点常用,养成好的注释习惯非常重要
// -c++注释风格
/* */ -c语言注释风格-不支持嵌套
如图:报错
c语言是一种结构化的语言-顺序、选择、循环结构,因此除了上方的顺序结构,还有选择和循环结构
7.选择语句
#include <stdio.h>
int main()
{ int input = 0;
printf("你会去敲代码吗?(选择1 or 0):>");
scanf("%d", &input);
if(input == 1)
{
printf("坚持,你会有好offer\n");
}
else
{
printf("放弃,回家卖红薯\n");
}
return 0;
}
8.循环语句
//while循环的实例
#include <stdio.h>
int main()
{
printf("好好学习\n");
int day = 0;
while(day<=2000)
{
day++;
printf("我要继续努力敲代码\n");
}
if(day>2000)
printf("好offer\n");
return 0;
}
9.函数(函数可以类比工厂-传参就好像原料,返回值就好像产品)
10.数组(存放一组相同类型元素)
10.1 定义数组(数组名是arr-定义数组的时候【】中是常量(【常量】)--不绝对-c99标准中引入了变常数组的概念)
10.2数组的不完全初始化(不必每个都放入值)![](https://i-blog.csdnimg.cn/blog_migrate/977fd07a2948db292ade88556a487176.png)
10.3 数组的下标(可以通过下标访问元素)![](https://i-blog.csdnimg.cn/blog_migrate/651371cc4bced40963b0ab2a772f4e43.png)
10.4 数组的使用(多个元素-输出要通过循环)
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
11.操作符(编译器识别操作符语义的时候是通过操作数来判断的)
①单目操作符(只有一个操作数)
1.!(补:c语言中,0表示假,非0表示真。 !成为零逻辑反操作)把假变真,把真变假
2.-,+(和数学上的定义一样,放在数字前表示正,负的)
3.sizeof(计算操作数的类型长度(所占空间大小),输入的可以时变量和类型,单位是字节-切记不是函数)![](https://i-blog.csdnimg.cn/blog_migrate/8f47d7b68a3c1dff78a56c471da021e3.png)
4.++和--操作符(①分前置和后置++②以下只会演示++,--操作符同理)![](https://i-blog.csdnimg.cn/blog_migrate/8d8b3442744ea7544bb445c686a0a06d.png)
注意++操作符易出现误用,如下图的代码情况
int a=1;
int b=(++a)+(++a)+(++a);
b=?;
上图的代码段看似能够用操作符的优先级来解决,但是实际情况是编译器不能正确判断是三个前置++先实现(结果==12),还是前面两个前置++先实现,相加完后的结果再来与后头a相加(结果==10)附上VS2019和Linux平台下跑出的结果
②强制类型转换-()
int main()
{
int a=(int)5.20;//原本5.20,默认为double类型-(int)强制类型转换成int类型
printf("%d,\n",a);
}
③关系操作符(>,<,>=...)
这些操作符和数学上的定义是一样的,使用关系操作符的时候要看两个操作数是否能被用来单纯的比较,比如一个字符串类型的变量就不能和int类型的变量来比较
④逻辑与和逻辑或
&&- 表示的是逻辑与(必须两个都满足,才为真)
||-表示的是逻辑或(至少一个满足就为真)
⑤条件操作符(唯一的一个三目操作符)
//条件操作符
//(exp1?exp2:exp3)
//如果表达式exp1为真,则exp2计算,exp3不计算
//如果表达式exp1为假,则exp2不计算,exp3计算
⑥逗号表达式(由逗号隔开的表达式)
//逗号表达式:(exp1,exp2,exp3...);
⑦【】(下标访问操作符-切记操作数(两个)是数组名和下标)
int arr[10]={0};
arr[5] //[]--下标访问操作符
⑧()(函数调用操作符-操作数是函数名和形参)
void swap(int *a,int *b)//()-函数调用操作符
{
int tmp=*a;
*a=*b;
*b=tmp;
}
12.常见关键字-由c语言提供,用户无法创造关键字,且关键字不能用作变量名
// 1.auto(所有的局部变量本质上前面都有auto(被省略)-作用,出作用域销毁变量
// 2.break(用于switch和循环语句) 3.case(用于Switch语句)
// 4.六·大类型关键字 5.const-修饰变量(具有常属性)
// 6.continue(用于循环语句) 7.default(用于switch语句) 8.if和else(选择语句)
// 9.enum(枚举关键字) 10.extern(用于自定义类型关键字)
// 11.goto(实现分支-goto语句) 12.register(寄存器变量-类似于auto自动变量)
// 13.return返回(一般用于函数) 14.signed(有符号的)unsigned(无符号的)-指的是数字前有无符号
// 15.static(静态的) 16.struct-结构体,自定义类型关键字 17.typedef-类型重命名
// 18.union-联合体,自定义类型 19.void-空类型 20.volatile-段位关键字 21.while
//以下是几个基础的关键字
①extern(声明外部符号的,用于全局变量和函数(对于局部变量无意义-出了作用域便销毁))
②typedef类型重命名(起别名-主要给复杂类型使用)
unsigned int num=10;
typedef unsigned int uint;
uint num2=10;//unsigned int此时和uint等价
③register
介绍register之前,我们需要来介绍一下存储器的概念
register int a=20;就是建议把20放入寄存器当中
//之所以说是建议,是因为系统不会满足用户各种无理的要求,将一些无关紧要放入寸土入金的寄存器当中。最终会否放入寄存器,还得看系统的判断
④static(静态的)-修饰静态(数据存储类型的指令)
为了更好地学习static,我们先要来了解内存分区的知识
1.static修饰局部变量![](https://i-blog.csdnimg.cn/blog_migrate/c2135cb382c1cb1bedfa856722dc9a8f.png)
总结:1作用域并没有变化-2生命周期变长(存储位置变化,和程序的生命周期一致)-3变量可被修改(区别于const)
2.static修饰全局变量(本质上是改变了变量的链接属性)(全局变量在任意地方都可以使用,但是要正确的声明和定义-防止其他人使用)![](https://i-blog.csdnimg.cn/blog_migrate/cfe51ab69cf91f3c6207be898baf2834.png)
3.static修饰函数(函数本身具有外部链接属性-使用static修饰函数类似于修饰全局变量-防止其他人使用)![](https://i-blog.csdnimg.cn/blog_migrate/0c5d7c4f2a5644b1b7d9109f85c29677.png)
13#define定义常量和宏
①#define定义常量![](https://i-blog.csdnimg.cn/blog_migrate/e33ee68e6db39a21d996f66a87a9ae70.png)
②#define定义宏![](https://i-blog.csdnimg.cn/blog_migrate/39d7b27dd24da1fa442bf0ce48e50733.png)
③#define定义宏与函数的比较
既然宏具有两个缺点,那么能否说用函数就一定比定义宏来的好呢?
--答案是:不一定。因为函数的创建需要开辟额外的空间,当面临一个语句的重复调用时,重复开辟空间和调用函数会导致效率降低,如果直接用define定义的宏直接在预处理阶段展开和替换,不需要额外去开辟空间,可以在一定程度上提高效率。
14.指针(初始)
14.1引入内存
我国国土有960万平方公里-那么是如果管理的?-省(自治区)-市-县(合理划分),如何找人呢?-在某某大学(社区)几号楼,几零几--那么计算器存储也要合理划分,把空间细化,每一个空间都编号,每一个空间都有一个对应的地址和它对应关联)
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
为什么内存不以bit为单位?
存放地址是为了找寻目标-如何使用指针找寻目标呢?
总结:变量在内存中都会开辟空间,有着对应的一个地址,我们可以创建一个指针变量来存放这个地址(指针变量就是专门用来存放地址的)注意:寄存器和内存是两个不同的概念
15.结构体(描述复杂对象的时候使用)
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。
比如描述学生,学生包含:名字+年龄+性别+学号这几项信息。
这里只能使用结构体来描述了。
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
如何访问结构体成员变量?
①结构体指针![](https://i-blog.csdnimg.cn/blog_migrate/f1953f21f58702f8c7a1bdf2115b4e5b.png)
②结构体变量![](https://i-blog.csdnimg.cn/blog_migrate/50cb8d4676473f770f2114aa523bb235.png)
结构体类型过于复杂?用typedef类型重命名![](https://i-blog.csdnimg.cn/blog_migrate/f8baf98a446f38b587264f90ba9c0473.png)
以上就是关于c语言的初探,对于初学者来说,就是多模仿,多上手,多思考。-纸上得来终觉浅,绝知此事要躬行。