文章目录
前言
某985金统系大一零基础纯小白,这是我自己这两个星期对c语言初次认识的结果与总结。初始C语言不必深究,先知道有这么个东西就行。就像高考数学一样,没有人直接上来就一轮,都是先粗略地整体学完再进行深究(别杠我呜呜我真的就这样学的)
一、什么是C语言
①是一门通用计算机编程语言,广泛应用于底层开发。
②硬件——驱动层——操作系统(windows linux mac)——应用软件
③操作系统之上称为上层软件 以下称为底层
④二进制的指令——汇编指令(助记符)——B语言——C语言
⑤为了统一C语言语法,美国国家标准局制定了ANSI C 目前2011年发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准
⑥编译器(将代码翻译成能让电脑执行看得懂的命令)主要有Clang、GCC、MSVC(VS2019就是用这个)
编译器:将C语言代码转换成CPU能够识别的二进制指令,也就是将代码加工成 .exe 程序;这个工具是一个特殊的软件,叫做编译器
二、第一个C语言程序
如何打开VS2019创建项目?
1.打开空项目
2.【视图】—【解决资源管理器】
3. 创建源文件(.c为后缀的叫源文件 .h叫头文件)
【源文件】-【添加】-【新建项】
4.修改名称为test.c
三、VS2019的一些常用快捷键
- 快速运行代码:ctrl+fn+f5
- 添加注释:ctrl+k+C
- 取消注释:ctrl+k+u
- ctrl+滚轮进行字体大小设置
- 监视:ctrl+f10 调试—窗口—监视—任意点击监视1—输入要监视的变量
- 深入函数内部监视:ctrl+f10运行到该函数所在行—按下ctrl+f11—右键点击该行—查看反编码
四、数据类型
创建变量的本质:通过类型向内存申请空间
五、变量,常量
5.1局部变量和全局变量
-
①不允许在同一个作用域中定义多个相同名称的变量
比如:在一个班级中存在两个名字相同的学生王帅,当老师点王帅回答问题时,那个回答就冲突了。 -
②允许在不同的作用域中定义多个相同名称的变量
比如:两个班级中各有一个王帅,老师在A班中点王帅回答问题,不会有任何歧义。 -
③当局部变量和全局变量同名的时候,局部变量优先使用。
5.2变量的使用——初始化所有变量
5.3外部全局变量的调用
如果有来自其他地方的全局变量
用extern 变量类型 变量名字;
5.4常量的分类
①字面常量 ②const修饰的常变量 ③#define定义的标识符常量 ④枚举常量
#include <stdio.h>
//建议自己复制粘贴过去实操一遍
//举例
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 100
printf("max = %d\n", MAX);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的
六、VS2019每次更新后如何让scanf每次打开都能用
①打开everything搜索newc++
②找到文件并且打开路径
③拷贝文件到桌面 用记事本打开后复制粘贴那行代码
④用vs打开桌面上这份文件并且ctrl+s保存下来即可
⑤再用桌面文件替换原来那份newc++文件
七、字符串+转义字符+注释
7.1字符串
- 由双引号引起来的叫做字符串 在c语言中他没有类型
- 由单引号引起来的叫做字符 在c语言中他的数据类型是char
- 字符串的结束表示是\0转义字符,在计算字符串长度时候不计入#include
<stdio.h>
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
char arr1[] = "bit";
char arr2[] = {'b', 'i', 't'};
char arr3[] = {'b', 'i', 't', '\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
7.2 转义字符
空格也算是一个字符 \t也只算一个字符
转义字符 释义
\?
在书写连续多个问号时使用,防止他们被解析成三字母词
\'
用于表示字符常量'
\“
用于表示一个字符串内部的双引号
\\
用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a
警告字符,蜂鸣
\b
退格符
\f
进纸符
\n
换行
\r
回车
\t
水平制表符
\v
垂直制表符
\ddd
ddd表示1~3个八进制的数字。 如: \130 X
\xdd
dd表示2个十六进制数字。 如: \x30 0
7.3 注释
- C语言风格的注释 /xxxxxx/
缺陷:不能嵌套注释 - C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行
八、选择语句
#include <stdio.h>
int main()
{
int coding = 0;
printf("你会去敲代码吗?(选择1 or 0):>");
scanf("%d", &coding);
if(coding == 1)
{
prinf("坚持,你会有好offer\n");
}
else
{
printf("放弃,回家卖红薯\n");
}
return 0;
}
九、循环语句
//while循环的实例
#include <stdio.h>
int main()
{
printf("下载vs2019\n");
int line = 0;
while(line<=20000)
{
line++;
printf("我要继续努力敲代码\n");
}
if(line>20000)
printf("好offer\n");
return 0;
}
十、函数
#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;
}
上述代码,写成函数如下:
#include <stdio.h>
int Add(int x, int y)
{
int z = x+y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = Add(num1, num2);
printf("sum = %d\n", sum);
return 0;
}
十一、数组
11.1数组的定义:一组相同类型元素的集合
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
//如果不知道数组提前占多少内存
//就直接arr[]里面什么都不写即可
11.2 数组的下标
11.3数组的使用
数组的初始化如果未完全 则会自动填充\0
#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;
}
十二、如何在vs2019窗口调试
按下ctrl+f10之后(笔记本电脑按ctrl+fn+f10)
十三、%d %s的意思
十四、三目操作符
int c =a>b?a:b;
//如果a>b的结果为真就输出a
//如果a>b的结果为假就输出b
十五、关键字:typedef
顾名思义:就是对类型进行重命名
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
十六、关键字:static
#关键字void表示这个函数没有return返回值
- static修饰局部变量:放到静态区域
- static修饰全局变量:使得全局变量由外部链接属性变为内部链接属性,其它源文件.c不能再使用它
- static修饰别的文件的函数:还是外部链接属性变为内部链接属性,其他源文件.c不能再使用它extern int Add(int x,int y);
①修饰局部变量:
- 输出的结果是10个2 说明每次进入到test这个函数 都是a=1。
- 这也说明了a这个变量的作用域是在test这个函数内部 只要使用完test这个函数,变量a立刻被销毁,即生命周期结束。
- 而经过了static修饰的a,则可在整个程序存在 这时候a就不会被销毁了 且每次进入test函数的第一行都失效不会再变为1。
#而加入了static之后:
解释原因:计算机的内存分为了栈区、堆区和静态区;
②修饰全局变量
③修饰函数
十七、#define定义常量和宏
再次强调:知道有这么个东西就行了现在!
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y))
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
十八、指针!
18.1 内存
- 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
- 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
- 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址
- 手机很喜欢说自己内存4G 6G 8G
那么可以换算以下32位电脑,意味着它拥有三十二根地址线,在通电的时候可以产生脉冲信号0或者是1,那么就会产生总共2的32次方个地址序列,已知每个地址序列的大小是1kb,那么总共就有4,264,967,296byte,经过换算,➗1024=4,194,304mb,➗1024=4096Mb,➗1024=4GB,这就是内存大小!!! - 在内存地址中,用十六进制进行地址序列命名
18.2如何在vs2019上查看内存
在ctrl+f10之后才能看到内存和监视!!!
int main()
{
int a = 10;//向内存申请了四个字节的内存空间 因为整型的大小是四个字节
//a占了四个字节所以有四个地址 这时候a的地址取出来的应该是第一个也就是最小的地址
&a;//取地址操作符 这样可以取出a的地址 用调试查看地址
printf("%p\n", &a);//%p是以地址的形式来打印
int* p =&a;//用int*类型存储a的地址到变量p中,此时p被称为指针变量
//存放地址的变量被称为指针变量 指针=编号=地址
return 0;
}
18.3小科普:
0a 00 00 00
08 09 0a 0b
所以下面一行是0c
10进制由0、1、2、3、4、5、6、7、8、9 十个数字组成
8进制则是0-7
2进制是0-1
16进制是0-9、A-F
- 10转换成16进制正是 0x 00 00 00 00 0a
- 这个0x是十六进制的开头 八进制用0开头 二进制则是b
- 所以可以看见内存中的数据是倒着的存放形式(至于为什么是倒着存后面会讲)
18.4 指针变量的大小
32bit位电脑:4byte;
64bit位电脑:8byte;
十九、结构体
- 结构体是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);