1.什么是C语言
什么是计算机的编程语言—计算机语言
汉语、日语、英语(人和人交流的语言)
计算机语言:人和计算机交流的语言
C
C++
Java
Python
go
上千种计算机语言,C语言只不过是其中一种而已
应用软件(QQ、百度网盘、游戏)
操作系统(windows/MacOs/Linux)
驱动
电脑-硬件
(早期)写程序:用二进制
计算机能够识别二进制!
100001-ADD-助记符
二进制-汇编语言(低级语言)-B语言-(高级语言)C语言-C++-Java
C1 C2 C3…
ANSI:C89 C90 C99 C11…
其编译器主要有Clang(苹果)、GCC(Linux)、MSVC(VS2019 集成开发环境)
VS2019-集成开发环境-IDE 编辑器 编译器 链接器 调试器F10
2.如何写第一个C语言代码?
-
创建一个项目 VS2022
空项目
项目名字(要有一定的意义、尽量不要中文)
代码路径(最好能够修改成自己想要放到代码的位置)
创建
(视图-解决方案管理器)
-
创建源文件
写C语言代码的时候 我们代码放在文件中
.h hender 头文件
.c 源文件
平常一般会把代码放在.c中
名称:后缀.c(C语言) 后缀.cpp(C++)
-
写代码
main函数叫主函数
主函数是程序的入口
C语言代码中必须有主函数,但是有且只有一个
一个项目中,可以有多个.c文件,但是多个.c文件中只能有一个main函数
注释//
F5 F10
void main(古老的写法)✗
int main(void)表示main函数不需要参数
int-整型-整数 return一个整数
printf-打印函数 专门用来在屏幕上打印数据的 是C语言标准库中提供的一个库函数
scanf-输入
include 是包含的意思 下面的代码就是包含stdio.h这个头文件
stdio-standard input output标准输入输出头文件
3.数据类型
为什么写代码?-为了解决生活中一些重复的问题
C语言必须有能力描述我们的生活
-
char 字符数据类型 (1字节)char ch='w'
-
short 短整型(2字节)(-32768~32767)
-
int 整型(4字节)(-21亿~21亿)
-
long 长整型(4字节)
-
long long 更长的整型C99(8字节)
-
float 单精度浮点数(4字节)float weight=75.5f
-
double 双精度浮点数(8字节)
C语言规定sizeof(long)>=sizeof(int)
浮点数-小数点可以浮动(科学计数法)
%d 打印十进制的整数
%c打印字符
\n 换行
sizeof是一个操作符,试计算变量的大小的-字节
计算机常见的单位-bit(比特位)、byte(字节)、KB、MB、GB、TB、PB
十进制的数字0~9
二进制的数字0~1
00-1
01-1
10-2
11-3
1byte=8bit □□□□□□□□
1KB=1024byte
1MB=1024KB
1GB=1024MB
1TB=1024GB
1PB=1024TB
…
-
3.1变量、常量
int age=18;(创建变量不赋值,不是一个好的习惯,在创建变量的同时给一个初始值)
double salary=20000;
-
3.2变量的命名
只能由字母(包括大小写)、数字、下划线组成
不能以数字开头
长度不能超过六十三个字符
变量名区分大小写
变量名不能使用关键字
-
3.3变量的分类
局部变量(大括号内部){
全局变量(大括号外部)
局部变量和全局变量名字冲突的时候,局部优先,尽量不要冲突
-
变量的使用
哪里用哪里创建,什么时候用什么时候创建
计算两个数的和
创建变量int
输入数据(scanf"%d%d",&num1,&num2)
计算求和
输出结果printf
3.4变量的作用域和生命周期
全局变量和静态变量默认初始化是0;局部变量不初始化的时候默认是随机值。
-
作用域
局部变量的作用域是变量所在的局部范围
全局变量的作用域是整个工程
变量的使用:先声明再使用(声明外部符号extern)
-
生命周期
局部变量的生命周期是进入作用域生命周期开始(申请内存),出作用域生命周期结束(结束后内存归还电脑)
全局变量的生命周期是整个程序的生命周期
3.5常量
C语言的常量和变量的定义形式有所差异
C语言中的常量分为以下几种:字面常量(数字、字符字面常量、字符串字面常量)
const修饰的常变量(const int num=100,不能被修改,具有了常量的属性,但是编译器认为它仍是一个变量,即本质上还是一个变量)
#define定义的标识符常量(#define M 100)
枚举常量(一一列举enum,例:血型、性别、三原色)
4 字符串+转义字符+注释
4.1字符串
由双引号引起来的一串字符称为字符串字面值,简称字符串
{'a', 'b', 'c'} -abc (三个元素)(持续打印后续随机的东西)(长度为随机值)
(可以在c后面加一个\0) {'a', 'b', 'c','\0'}(长度为3)
“abc”-abc\0(四个元素)(长度为3)
%s-打印字符串,打印到\0才停止
注:字符串结束的标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算做字符串的内容
C语言提供库函数,可以计算字符串长度strlen/string lengrh(统计的是\0之前有多少字符,不算\0)
4.2转义字符
转义:转变原来的意思
5注释
代码中有一些东西很难懂,加一个解释
6.选择语句
7.循环语句
while循环
for语句
8.函数
数学函数f=(x)
可以把函数(Add)想象成一个工厂,输入材料(num1,num2),经过加工(相加)之后,生产小汽车(返回结果)
int Add(int x,int y)
{
int z=x+y;
ruturn z;
}
函数的特点就是简化代码,代码复用。
9.数组
存放一组相同类型的元素
9.1数组的定义
int arr[5]={1,2,3,4,5};
数组类型+数组名字;[ ]指的是数组的大小
不完全初始化:指数组m
9.2数组的下标
数组的下标从零开始,数组的下标可以用变量,通过下标访问数组中的元素
9.3数组的使用
10操作符
C语言中提供了非常丰富的操作符,使得C语言非常的灵活
算术操作符+ - * / %
例:int n=17/4 求整数商
int n=10/4(结果为2)
float n=10.0/4.0(结果为2.5)
除号的两端如果都是整数,执行的是整数除法
除号的两端至少有一个浮点数,才能执行浮点数的除法
%取模(取余)的两端必须都是证书
-
%d-十进制的整型
-
%c-字符
-
%s-字符串
-
%f-打印float类型的浮点数
-
%lf-打印double类型的浮点数
移位操作符>> <<
位操作符& ^ |
赋值操作符 = += -= *= /= %= &= ^= |= >>= <<=
-
int a=0;初始化,创建变量的同时给一个值,叫做初始化
-
a=20;赋值
-
a=a+5 等同于a+=5
-
a=a*10等同于a*=10
C语言中,0表示假,非0表示真
单目操作符
-
!逻辑反操作
-
-负值
-
+正值
-
&取地址
-
sizeof操作数的类型长度(以字节为单位)
-
~对一个数的二进制按位取反
-
-- 前置、后置--
-
++前置、后置++
后置++:先使用,后++
int a=100;
int b=a++;等价于int b=a,a=a+1
前置++:先++,后使用
int a=100;
int b=++a;等价于a=a+1,b=a
-
*间接访问操作符(解引用操作符)
-
(类型)强制转换类型
int a=(int)3.14; 这里只取整数部分
sizeof 是操作符,是计算变量所占内存空间的大小,单位是字节
strlen是库函数,是计算字符串的长度的,统计的是字符串中\0之前出现的字符个数
关系操作符
-
>
-
>=
-
<
-
<=
-
!=用于测试不相等
-
==用于测试相等
逻辑操作符
-
&&逻辑与(并且) if (a&&b)两边同时为真,才为真
-
||逻辑或(或者) if(a||b)两边同时为假,才为假
条件操作符
-
exp1 ? exp2 : exp3
(a > b ? a : b )
如果表达式一为真,表达式二要计算,表达式三不算;如果表达式一为假,则表达式二不算,表达式三要计算
逗号表达式
-
exp1,exp2,exp3,...exp4
下标引用、函数调用和结构成员
-
[ ], ( ) . ->
访问数组元素[数组元素下标]
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 typedef union unsigned void volatile while
类型auto char int short long float double signed(有符号的)unsigned(无符号的)static void const enum union struct typedef
循环break continue do while for
分支if switch case break default goto
声明外部符号extern
寄存器register
函数return
计算所占内存大小sizeof
11.0关键字register(寄存器)
计算机上,数据都可以存储在哪里呢?
-
寄存器 字节
-
高速缓存xx M
-
内存 8G/16G
-
硬盘 500G
-
网盘 2T
越往上速度越快,造假越高,空间越小
CPU中央处理器
register int a=10建议编译器把a的值存在寄存器里
11.1关键字typedef
类型定义,可以理解为类型重命名
例:typedef unsigned int uint;可以把复杂的命名简单化
11.2关键字static(静态的)
三种用法:修饰局部变量
修饰全局变量
修饰函数
11.2.1修饰局部变量
内存:栈区:局部变量、函数参数、临时的变量(进入作用域创建,出了作用域就释放)
堆区:动态内存分配、malloc、callocc、realloc、free
静态区:静态变量、全局变量(放在静态区的数据创建后直到程序结束才释放)
int a=0/static a=0
#include<stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
#include<stdio.h>
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;
}
普通的局部变量是放在栈区上的,这种局部变量进入作用域创建,出了作用域释放
但是局部变量被static修饰后,这种变量就放在静态区,放在静态区的变量,创建好后,直到程序结束才释放。
本质上:static的修饰改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样
被static修饰不影响作用域的!!!但是生命周期发生了变化,变长了。
11.2.2修饰全局变量
extrn//声明外部符号
全局变量本身是具有外部连接属性的,在A文件中定义的变量,在B文件中可以通过【链接】使用
但是如果全局变量被static修饰,这个外部链接属性就变成了内部连接属性,这个全局变量只能在自己所在的源文件内部使用
static的修饰,会把外部连接属性变成内部连接属性,最终使得全局变量的作用域变小了(即使有extern的声明也不行)
11.2.3修饰函数
函数本身是具有外部连接属性的,被static修饰后,外部链接属性就变成了内部连接属性,使得这个函数只能在自己所在的源文件内部使用,其他源文件无法使用。
限制了作用域
12.#define定义常量和宏
#define M 100
#define MAX(x,y)(x>y?x:y)
MAX宏的名字、(x,y)宏的参数、(x>y?x:y)宏体
13.指针
首先要理解内存
内存是计算机上的存储空间,8G/16G,程序运行的时候会载入内存, 程序中如果有数据需要存储,也会申请内存空间
如何有效使用内存:
在一个大厦中,一个门牌号(地址
)对应一个房间
内存单元的编号(地址)(地址也叫指针)
一个内存单元的大小是一个字节
如果访问一个内存单元,那内存单元的地址(指针)如何产生呢?
以32位机器为例:32根地址线,地址线如果通电
00000000000000000000000000000000 |
0 |
1字节 |
00000000000000000000000000000001 |
1 | |
00000000000000000000000000000010 |
2 | |
... | 3 | |
01111111111111111111111111111111 |
4 | |
10000000000000000000000000000000 |
5 | |
.. . |
6 | |
11111111111111111111111111111111 |
... |
一共产生2^32个这样的二进制序列,就可以作为2^32个地址,就可以管理2^32个内存单元,也就是2^32个字节的内存空间=4GB
编号=地址=指针
int a=1: //向内存申请4个字节
&a; //取地址操作符
//&a取出的是a所占内存的4个字节中第一个字节的地址
int * pa=&a; //pa是一个变量,用来存放地址的,而地址又叫指针,所以C语言中把pa叫指针变量(指针变量是存放指针的变量)
//*告诉我们pa是指针,pa指向的是int类型的变量
printf("%p\n",&a); 等价于printf("%p\n",pa);
进制只是数值的表示形式
*pa=20; //解引用操作,作用就是通过pa中的地址,找到a,*pa就是a
//a=20
指针:1.指针就是地址 2.口头语中指针一般指的是指针变量
13.2指针变量的大小
一个指针变量的大小是多少?
指针变量是用来存放地址的
32位机器上是32个bit位,指针变量存放的是32bit的地址,指针变量的大小是4个字节
64位机器上是64个bit位,指针变量存放的是64bit的地址,指针变量的大小是8个字节
x86是32位环境,x64是64位环境
14.结构体
C语言的内置类型
char
short
int
long
long long
float
double
人:姓名,性别,身高,体重,年龄...
书:书名,作者,出版社,定价...
复杂对象很难用一种类型名描述清楚
自定义的类型:
-
结构体
-
枚举
-
联合体
结构体的关键字:struct
定义一个学生类型
struct Stu
{
char name[20];
char sex[5];
int age;
}
int main()
{
int num=0;
struct Stu s={"zhangsan","男","20};
struct Stu s2={"如花","女","18};
print("%s\n",s2.name);
//结构体变量.成员名(访问结构体中的数据)
return 0;
}
//结构体的指针->成员名
void Print(struct Stu*ps)
{
printf("%s %s %d\n",(*ps).name,(*ps).sex,(*ps).age);
或者printf("%s %s %d\n",ps->name,ps->sex,ps->age);
}