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



