第一章--C语言
一、C语言
1.c语言的定义
是一门计算机语言(人和计算机交流的语言),应用于底层开发。
2.计算机语言的发展
低级语言1.机器语言-二进制(0和1)2.符号语言(助记符,汇编语言)
高级语言
二、编写C语言程序过程
文件-新建-项目(CTRL-shift-N)
c++/新项目
添加源文件(.c)(ctrl-shift-A)-C++文件(.cpp)
写代码
#include<stdio.h>//函数名 //#include(包含)一个studio.h的头文件 //函数体 //int整型,表示main函数调用返回一个整型值 int main()//main-主函数-程序的入口-不能缺少,有且仅有一个 { printf("hello world\n");//完成任务,输出“hello world”,"\n"换行 //print--库函数-打印函数 //库函数-C语言本身提供的函数 return 0;//返回0, }
三、数据类型
1.类型种类
char:字符数据类型 — %c(一个字符)%s(字符串)
short:短整型 — %d (整型十进制);%u(无符号整型十进制);%o(八进制);%x(十六进制a~f);%X(十六进制A~F);%p(按地址打印,十六进制)
int:整型 — %d
long:长整型 — %ld
long long:更长整型 %lld %I64d
float:单精度浮点数 —%f(小数形式输出单精度浮点数)
double:双精度浮点数 —%lf
#include<stdio.h> //char-字符类型,创建变量ch,向内存申请空间, int main() { char ch = 'A';//用等号的形式存放 printf("%c\n", ch);//A;%c-打印字符格式的数据 //以字符的形式打印ch int age = 20; printf("%d\n", age);//20;%d-打印整型十进制数据 long num = 100; printf("%d\n", num);//100; float f = 5.0; printf("%f\n", f);//5.000000;%f-打印浮点数字-打印小数 double d = 3.14; printf("%lf\n", d);//3.140000;%lf打印双精度浮点数字 return 0; }
2.类型大小
C语言标准规定:sizeof(long)>=sizeof(int)
为什么出现这么的类型?为了空间利用率
#include<stdio.h> //char-字符类型,创建变量ch,向内存申请空间, int main() { //字节byte-计算机中单位(bit/kb/mb/gb/tb/pb) //sizrof-关键字-操作符 printf(" %d \n", sizeof(char));//1字节 printf(" %d \n", sizeof(short));//2字节 printf(" %d \n", sizeof(int));//4字节 printf(" %d \n", sizeof(long));//4或8字节 printf(" %d \n", sizeof(long long));//8字节 printf(" %d \n", sizeof(float));//4字节 printf(" %d \n", sizeof(double));//8字节 printf(" %d \n", sizeof(long double));//8字节 return 0; }
3.计算机单位
bit/比特位:存储一个二进制位(0,1)
byte/字节:存储8个bit/比特
kb/千字节:1024byte
mb/兆字节:1024kb
gb-1024mb
tb-1024gb
pb-1024tb
四、变量、常量
1.定义变量的方式
类型+变量名=0 ,赋一个值,即初始化
#include<stdio.h> int main() { short age = 20;//向内存申请2个字节,byte16个比特位bit,用来存放20 float weight = 95.6f;//95.6默认是double类型,精度丢失 //float向内存存放申请4个字节,存放小数。 return 0; }
2.变量的分类
局部变量和全局变量的名字不要相同,会产生bug。
当局部变量和全局变量的名字相同的时候,局部变量优先
#include<stdio.h> int num2 = 20;//全局变量-定义在代码块{}之外的变量 int main() { int num1 = 10;//局部变量-定义在代码块{}内部的变量 return 0; }
3.变量的使用
#pragma warning(disable:4996)//将某个警报置为失效 //或者#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { //计算2个数的和 int num1 = 0; int num2 = 0; int sum = 0; //输入数据-使用输入函数scanf scanf("%d%d", &num1, &num2);//scanf-取地址符号 //可以用scanf_s代替,是VS提供,不是C语言环境 //"%d%d" — 取地址;&num1, &num2 — 地址 //c语言语法规定,变量要定义在当前代码块的最前面 sum = num1 + num2; printf("sum= %d\n", sum); return 0; }
4.变量的作用域和生命周期
局部变量的作用域:变量所在代码块的局部范围
全局变量的作用域:整个工程
局部变量生命周期:入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期:整个程序的生命周期
5.常量
种类
- 字面常量
- const 修饰的常变量 -- 本质还是变量
- #define定义的标识符常量
- 枚举常量(一一举例常量)
#include<stdio.h> int main() { int num = 4; //字面常量 "3.14"; //浮点数 "10";// 整型 "abcdef"//字符串 return 0; }
#include<stdio.h> int main() { //const-具有常属性,即不能被改变的属性 //const修饰的常变量,内容不能被修改 const int num = 4; printf("%d\n", num); /*num = 8; printf("%d\n", num);*/ return 0; }
#include<stdio.h> //#define定义的标识符常量 #define MAX 10 int main() { int arr[MAX];//MAX=10 return 0; }
#include<stdio.h> //#define定义的标识符常量 #define MAX 10//MAX就是define定义的标识符常量 //不能修改 int main() { int arr[MAX];//MAX=10 return 0;
#include<stdio.h> //枚举常量-enum //枚举-一一列举 //性别:男,女,保密 enum Sex { //枚举常量的变量的未来可能取值 MALE=3,//赋初值,即为3 FEMALE,//4 SECRET//5 }; int main() { // 枚举常量的默认是从0开始 //依次向下递增1的 //是常量,不能更改 printf("%d\n",MALE);//0 printf("%d\n",FEMALE);//1 printf("%d\n",SECRET);//2 return 0; }
#include<stdio.h> //颜色:红、黄、蓝 enum Color { RED, YELLOW, BLUE }; int main() { enum Color color = BLUE; color = YELLOW; return 0; }
五、字符串+转义字符+注释
1.字符串
字符串--是一组形同类型的元素。由双引号引起的字符,例如"abcde";" "为空字符串
字符串结束标志‘\0’,不算字符串内容,是转义字符
数据在计算机存储的时候,是二进制。
ASCII 编码 a-97;z-120;A-65;Z-90;0-48;9-57
#include <stdio.h> #include<string.h> //引用头文件--为strlen引用 int main() { char arr1[] = "abc"; char arr2[] = { 'a','b','c' }; char arr3[] = { 'a','b','c','\0' }; printf("%s\n", arr1);//abc printf("%s\n", arr2);//abc烫烫烫烫蘟bc printf("%s\n", arr3);//abc //strlen-计算字符串长度 printf("%d\n", strlen(arr1));//3; printf("%d\n", strlen(arr2));//15(为随机值);无字符串结束标志'\0' printf("%d\n", strlen(arr3));//3; return 0; }
2.转义字符
转义字符就是转变意思
\?--老版系统,防止多个?被解析成三字母词
\\--反斜杠,防止 \ 被解释为转义序列
\'--用于表示字符常量单引号
\"--字符串内部双引号
\a--警告字符
\b--退格符
\f--进制符
\n--换行
\r--回车
\t--水平制表符、空格
\v--垂直制表符
\ddd--1~3个八进制的数字
\xdd--dd为2个十六进制数字
#include<stdio.h> int main() { printf("abcdef\n");//\t-水平制表符-tab键 return 0; }
#include<stdio.h> int main() { printf("c:\text\32\test.c\n"); printf("c:\\text\\32\\test.c"); //“\\”反斜杠,对\进行转义,防止被解释为转义序列 return 0; }
#include<stdio.h> int main() { printf("are you ok\?\?\n"); return 0; }
#include<stdio.h> int main() { printf("%c\n",'\'');//\'--打印字符常量单引号 printf("%s\n", "\"");// \"--字符串内部双引号 return 0; }
#include<stdio.h> #include<string.h> int main() { printf("%d\n", strlen("c:\text\32\test.c"));//输出结果13 printf("%c\n", '\32'); //\32--两个八进制的数字 //32做为八进制代表那个十进制数字,ASCII码值,对应字符为➡ //32--3*8^1+2*8^0=27 printf("%c\n", '\132'); //8^2+3*8^1+2*8^0=90 return 0; }
3.注释
注释:代码难懂,注释文字解释
- c语言/* xxx*/ (缺陷,不能嵌套注释)
- c++ //xxx //(可以注释一行也可以注释多行)
六、选择语句
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { int input = 0; printf("加入比特\n"); printf("好好学习?(1/0)>:"); scanf("%d", &input);//1/0 if (input == 1) printf("offer\n"); else printf("卖红薯\n"); return 0; }
七、循环语句
- while循环
- for循环
- do ... while语句
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int line = 0; printf("加入比特\n"); while (line < 20000) { printf("敲代码:%d\n",line); line++; } if (line >= 20000) printf("offer\n"); return 0; }
八、函数
int Add ( ) { }
函数返回类型 函数名 函数参数 函数体
#include <stdio.h> int Add(int x, int y) { int z = x + y; return z; } int main() { int num1 = 10; int num2 = 20; int sum = 0; int a = 100; int b = 200; /*sum = num1 + num2;*/ sum = Add(num1, num2); /*sum = a + b;*/ sum = Add(a,b); sum = Add(2, 3); printf("sum = %d\n", sum); return 0; }
- 自定义函数
- 库函数
九、数组
一组相同类型元素集合
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
数组名称 有下标从0开始
0 1 2 3 4 5 6 7 8 9
确定访问的元素
#include <stdio.h> int main() { /*int a = 1; int b = 2; int c = 4;*/ int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个存放10个整数数字的数组 int i = 0; while (i < 10) { printf("%d\n", arr[i]); i++; } /*printf("%d\n",arr[4]);*///下标的形式访问元素 //arr[下标] /*char ch[20]; float arr2[5];*/ return 0; }
十、操作符
算数操作符
- + ,- ,* , / , %
#include <stdio.h> int main() { int a = 5 / 2; int b = 5 % 2;//取模,余数 printf("%d\n",a); printf("%d\n",b); return 0; }
移位操作符(2进制)
- >> <<
- 右移 左移
#include <stdio.h> int main() { int a = 1; //整型1占4个字节-32bit, //二进制0、1 //0000000000,0000000000,0000000000,01 int b= a << 1; //0000000000,0000000000,0000000000,10 printf("%d\n", b); printf("%d\n", a); return 0; }
位操作符(二进制,0为假1为真 )
-
& | ^
-
按位与 按位或 按位异或
-
只要有0,即为0 只要有1,即为1 对应相同,为0
- 对应相异,为1
赋值操作符
-
= (赋值) +=(复合赋值符,自身加) -=(自身减) *= /= &= ^= |= >>= <<=
#include <stdio.h> int main() { int a = 0; a = 20;//=赋值 ==判断相等 a = a + 10;//a+10赋值给a a += 10//a自己+10 return 0; }
单目操作符
- ! 逻辑反操作
- - 负值
- + 正值(通常省略)
- & 取地址
- sizeof 操作数的类型长度(计算的是变量、类型所占空间大小,单位字节)
- ~ 对一个数,二进制取反。即0为1,1为0
- -- 前置、后置--
- ++ 前置、后置++
- * 间接访问操作符(解引用操作符)
- (类型) 强制类型转换
对应的有双目操作符、三目操作符(有两个、三个操作符)
#include<stdio.h> int main() { int a = 10; int b = 0; int sz = 0; int arr[10] = { 0 }; //计数组的元素个数=数组总大小、每个元素的大小 sz = sizeof(arr) / sizeof(arr[0]); printf("%d\n", a);//10 printf("%d\n", !a);//0 printf("%d\n", b);//0 printf("%d\n", !b);//1 printf("%d\n", sizeof(a));//4 printf("%d\n", sizeof a);//4 printf("%d\n", sizeof(int));//4 printf("sz=%d\n", sz);//sz=10 return 0; }
#include <stdio.h> int main() { int a = 0;//4个字节,32bit int b = ~a;//b是有符合的整型 //00000000000000000000000000000000 //11111111111111111111111111111111 //11111111111111111111111111111110 //10000000000000000000000000000001 printf("%d\n", b);//-1;使用的、打印的是这个数的源码 //源码、反码、补码 //复数在内存中存储的时候,存储的是二进制的补码 return 0; }
#include <stdio.h> int main() { int a = 10; int b = a++;//后置++,先使用,再++ //int b =++a//前置++,先++,后使用,11,11 printf("a=%d b=%d\n",a,b);//11,10 return 0; }
#include <stdio.h> int main() { int a = (int)3.14; return 0; }
逻辑操作符
-
> >= < <= != ==
- 大于 大于等于 小于 小于等于 不等于 等于
逻辑操作符
-
&& ||
- 逻辑与 逻辑或
#include<stdio.h> int main() { //真-非0 //假-0 int a = 0; int b = 5; int c = a && b; int d = a || b; printf("c=%d\n", c);//c=0 printf("d=%d\n", d);//d=1 return 0; }
条件操作符(三目操作符)
- exp1 ? exp2 : exp3
- 表达式1的结果为真,表达式2执行,代表整个表达式的结果
- 表达式1的结果为假,表达式3执行,代表整个表达式的结果
#include<stdio.h> int main() { int a = 10; int b = 20; int max = 0; max = (a > b ? a : b); //exp1 ? exp2 : exp3 printf("max=%d\n", max);//max=20; return 0; }
逗号表达式
- exp1,exp2,exp3
下标引用、函数调用和结构成员
- [ ] ( ) . ->
#include<stdio.h> int Add(int x, int y) { int z = 0; z = x + y; return z; } int main() { int arr[10] = { 0 }; arr[4];//[]--下标应用操作符 int a = 10; int b = 20; int sum = Add(a, b);//()-函数调用操作符 return 0; }
原码、反码、补码
- 原码 反码 补码
- 按照正负 原码符号位不变 反码+1
- 二进制序列 其他位取反
十一、常见关键字
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(循环)
#include<stdio.h> int main() { auto int a = 10;//局部变量-自动变量,可以省略 register int a = 10;//建议把a放入寄存器中 return 0; }
#include<stdio.h> int main() { //typedef--类型定义,类型重定义 typedef unsigned int u_int;//起了别名 unsigned int num = 20;// 定义变量无符号 u_int num2 = 20; return 0; }
#include<stdio.h> void text() { //static 修饰变量和关键词 static int a = 1;//a--静态局部变量 a++; printf("a=%d\n", a);//2 3 4 5 6 } int main() { int i = 0; while (i < 5) { text(); i++; } return 0; }
static int g_val=2020 #include<stdio.h> //static 修饰全局变量 //改变变量作用域,静态的局部变量只能在源文件内部使用 int main() { //extern 引入外部符号 extern int g_val; printf(" g_val=%d\n", g_val); return 0; }
static int Add(int x, int y) { int z = x + y; return z; } #include<stdio.h> //#define定义标识符常量 //#define定义宏-带参数 #define MAX 100 int main() { int a = MAX; return 0; } #include<stdio.h> //static 修饰函数,改变函数连接属性,变成内部链接 //函数具有外部链接属性 extern int Add(int, int);//申明外部函数 int main() { int a = 10; int b = 20; int sum = Add(a, b); printf(" sum=%d\n", sum); return 0; }
十二、#define定义和宏
#include<stdio.h> int Max(int x, int y) { if (x > y) return x; else return y; } //宏定义 #define MAX(X,Y)(X>Y?X:Y) int main() { int a =10; int b = 20; //函数 int max = Max(a, b); printf("max=%d\n", max); //宏的方式 max = MAX(a, b); printf("max=%d\n", max); return 0; }
十三、指针p
1.内存
内存的概念:1字节,内存单位地址
32位,即32位数据线/地址线,受到正电(1)和负电(0)会产生232bit位
#include<stdio.h> //指针 int main() { int a = 10;//创建空间a,存储为10 int* p = &a;//取地址a,存储在p中。其中p为变量,int*是一个整体、类型。*说明p为指针 printf("%p\n", &a);//009EFBDC printf("%p\n", p);//009EFBDC *p = 20;//20存储到a中。*--解引用操作符/间接访问操作符 printf("a=%d\n", a); return 0; }
#include<stdio.h> int main() { char ch = 'w'; char* pc = &ch; *pc = 'a'; printf("%c\n", ch); return 0; }
2.指针变量的大小
#include<stdio.h> 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位平台是8个字节
十四、结构体struct
#include<stdio.h> //创建一个结构体类型 struct Book { char name[20]; short price; }; int main() { //利用结构体类型,创建一个该类型的结构体变量 struct Book b1 = { "C语言程序设计",55 }; printf("书名:%s\n", b1.name); printf("价格:%d元\n", b1.price); return 0; }
#include<stdio.h> struct Book { char name[20]; short price; }; int main() { struct Book b1 = { "C语言程序设计",55 }; //指针 struct Book* pb = &b1; printf("书名:%s\n", (*pb).name);//printf("书名:%s\n", pb->name); printf("价格:%d元\n",(*pb).price);// printf("价格:%d元\n",pb->price); return 0; }
结构体初始化