一、课前的小建议:
1.养成写博客的习惯:对所学知识的总结、面试的谈资、愿意分享
2.维护github/gitee账号:大公司认可
3.学会编程≠学会C语言:(包括但不限于)计算机语言、算法和数据结构、 *** 作系统、计算机网络、数据库+项目实战
一、什么是C语言
1.语言:人与人之间交流的工具 -> 计算机语言:人与计算机之间交流的工具 (C语言实质上可以理解为一种工具 与计算机交流的方式)
2.目前已经有上千种计算机语言了,C语言只是其中一种(不过一直是流行排行榜的前三!)
3.计算机语言的发展:由低级到高级 (由难以 *** 作变得全民均可编程)
二进制代码->汇编语言(助记符)-> B语言 -> C语言
4.C语言的国际标准 ANSI C C89 C90 C11
5.常见的编译器:Clang、GCC、MSVC、Turbo C
二、第一个C语言程序
1.注意后缀一定是.c 不然.cpp程序会以C++语法进行编译
#include
int main()
{
printf("hehe\n");
return 0;
}
2.C语言代码中一定要有main函数(主函数)
主函数的标准写法:
int main()
{
return 0;
}
古老的写法(不推荐):
void main()
{
}
3.printf是一个库函数,专门用来打印数据的
#include
std--标准 i--input o--output
VS上快速运行代码:ctrl+f5
4.调试手段:f10
C语言规定:mian函数是程序的入口、main函数有且只有一个
5. ctrl+k+c:注释代码
ctrl+k+v:取消注释
三、数据类型
1.为什么写代码:解决生活中的问题
char - 字符数据类型
short - 短整型
int - 整型
long - 长整型
long long - 更长的整型
float - 单精度浮点型
double - 双精度浮点型
2.为什么这么多的类型?——提高空间利用率
每种类型的大小是多少?
int main()
{
printf("%zu\n", sizeof(char));//1
printf("%zu\n", sizeof(short));//2
printf("%zu\n", sizeof(int));//4
printf("%zu\n", sizeof(long));//4
printf("%zu\n", sizeof(long long))//8;
printf("%zu\n", sizeof(float));//4
printf("%zu\n", sizeof(double));//8
return 0;
}
计算机中的单位 : bite-比特位 byte kb mb gb tb pb
十进制:0 1 2 3 4 5 6 7 8 9
二进制:0 1
1 byte = 8 bit (其余的单位间进制都是1024)
3.怎么使用类型?
int main()
{
int age = 20;
double price = 66.6;
return 0;
}
四、变量和常量
1.不变的量:身份z、性别、血型、圆周率
变化的量:年龄、体重、薪资
2.变量分为:局部变量({ }内部定义的变量)和全局变量({ }外部定义的变量)
int a = 100;
int main()
{
int a = 10;
printf("%d\n", a);//10
return 0;
}
当全局变量和局部变量名字相同的情况下,局部变量优先
但是建议不要把全局变量的名字和局部变量写成一样的
3.写一个代码,计算两个整数的和
printf是一个输出函数 scanf是一个输入函数
scanf不能通过?——建议使用scanf_s(VS自己提供的函数,非标准C)
解决方法:代码行第一行加上 #define _CRT_SECURE_NO_WARNINGS
VS安装路径下有一个newc++file.cpp的文件,在工程中创建新的c或者c++文件时,都是直接拷贝这个文件的
用everything找到这个文件,把#define _CRT_SECURE_NO_WARNINGS写入其中
int main()
{
int num1 = 0;
int num2 = 0;//初始化
//输入两个整数
scanf("%d %d", &num1, & num2);
//求和
int sum = num1 + num2;
//输出
printf("%d\n", sum);
return 0;
}
4. 变量的作用域和生命周期
int main()
{
{
int a = 10;
printf("%d\n", a);//10
}
printf("%d\n", a);//err
return 0;
}
int main()
{
int a = 10;
{
printf("%d\n", a);//10
}
printf("%d\n", a);//10
return 0;
}
局部变量的作用域就是变量所在的局部范围
int a = 10;
void test()
{
printf("test-->%d\n", a);
}
int main()
{
test();
{
printf("a=%d\n", a);//10
}
printf("a=%d\n", a);//10
return 0;
}
全局变量的作用域是整个工程
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期是:整个程序的生命周期
5.常量:描述不变的量
6.字面常量
30;
3.14;
'w';//字符
"abc";//字符串
7.const修饰的常变量
int main()
{
const int a = 0;
a = 10;//err
printf("%d\n", a);
return 0;
}
在C语言中,const修饰的a,本质是变量,但不能直接修改,具有常属性
int n = 10;
int arr[n];//err
const int n = 10;
int arr[n];//err
8.define定义的标识符常量
#define MAX 100
int main()
{
printf("%d\n", MAX);
int a = MAX;
printf("%d\n", a);
return 0;
}
#define STR "abcdef"
int main()
{
printf("%s\n", STR);
return 0;
}
9.枚举常量
enum Color
{
RED,
GREEN,
BLUE
};
enum Sex
{
MALE,
FEMALE,
SECRET
};
int main()
{
enum Color c = RED;
RED = 20;//err
return 0;
}
五、字符串+转义字符+注释
1.字符串
//char 字符类型
//'a';
//char ch = 'w';
C语言中没有字符串常量——用字符数组存储
int main()
{
char arr1[] = "abcdef";//有' char arr2[] = { 'a','b','c','d','e','f','int main()
{
int len = strlen("abc");//3
printf("%d\n", len);
return 0;
}
'};//结果正常
'
char arr2[] = { 'a','b','c','d','e','f' };//无'int main()
{
char arr1[] = "abcdef";
char arr2[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr1));//6
printf("%d\n", strlen(arr2));//34
return 0;
}
'
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
printf("abcn");//abcn
printf("abc\n");//abc
字符串的结束标志——\0
strlen——求字符串长度的函数(记得引头文件 string,h)
printf("abc0def");//abc0def
printf("abc printf("%s\n", "(are you ok??)");
def");//abc
printf("%s\n", "(are you ok\?\?)");//改进
2.转义字符
printf("%c\n", '\'');
\n——换行符
printf("\"");
\0——字符串的结束标志
printf("abcd\0ef");//abcdint main()
{
printf("%c\n", '0');//X
return 0;
}
ef
三字母词——早期少数编译器中出现
??)—— ]
??(—— [
printf("%c\n", '\x60');//`
%d——打印整型
%c——打印字符
%s——打印字符串
%f——打印float类型的数据
%lf——打印double类型的数据
%zu——打印sizeof的返回值
printf("%d\n", strlen("qwer t"));//6
printf("%d\n", strlen("c:\test8\test.c"));//14
\'——转义单引号,让一个单引号不是一对单引号中的一个,而是一个单独的单引号
//创建指针变量p,并赋值为NULL
int* p = NULL;
\"——转义双引号,让一个双引号不是一对双引号中的一个,而是一个单独的双引号
int main()
{
int input = 0;
printf("要好好学习吗{1/0)?");
scanf("%d", &input);
if (input == 1)
{
printf("好offer\n");
}
else
{
printf("卖红薯\n");
}
return 0;
}
\\——转义斜杠,让斜杠不是一个转义字符的一部分,而是一个单独的斜杠
路径打印一定是两个斜杠
\a——触发电脑蜂鸣
\t——水平制表符
int main()
{
int line = 0;
printf("开始学习\n");
while (line < 20000)
{
printf("写代码:%d\n",line);
line++;
}
if (line == 20000)
{
printf("好offer\n");
}
else
{
printf("继续加油\n");
}
return 0;
}
\ddd——打印以八进制数字转换为十进制数字为ASCII值对应的字符
\130——1*64+3*8+0=88 ‘X’的ASCII值
int main()
{
int n1 = 0;
int n2 = 0;
//输入
scanf("%d %d", &n1, &n2);
//求和
int sum = n1 + n2;
//打印
printf("%d\n",sum);
return 0;
}
\xdd——打印以十六进制数字转换为十进制数字为ASCII值对应的字符
\x60——6*16+0=96
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int n1 = 0;
int n2 = 0;
//输入
scanf("%d %d", &n1, &n2);
//求和
int sum = Add(n1, n2);
//打印
printf("%d\n",sum);
return 0;
}
3.注释
int Add(int x, int y)
{
return (x + y);
}
C语言的注释风格:/* */
C++语言的注释风格://
C的注释优点——可以一次性注释多行
缺点——不可以嵌套注释
注释的优点:可以梳理代码逻辑、对复杂的代码可以进行解释、既帮助自己也帮助别人
六、选择语句
int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
C语言实现分支——if/else语句、switch语句
七、循环语句
描述循环——while循环、do-while循环、for循环
20000行有效代码的积累!
int main()
{
int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
printf("%d\n", arr[8]);//18
return 0;
}
C语言是结构化的程序设计语言——顺序结构、选择结构、循环结构
八、函数(可以把函数类比成加工原材料的工厂)
int main()
{
int arr[10] = { 10,11,12,13,14,15,16,17,18,19 };
int i = 0;
while (i < 10)
{
printf("%d ", arr[i]);
i = i + 1;
}
return 0;
}
int main()
{
int n = 10;
int arr[n];
//C99标准之前,数组的大小都是用常量或者常量表达式来指定
int arr2[10] = { 0 };
int arr3[4 + 6] = { 1,2,3,4 };
//C99标准后,支持了变长数组,这个时候允许数组的大小是变量,但这种指定方式的数组是不能初始化的
int m = 100;
int arr4[m];/err
//VS对C99的支持不是很好,不支持变长数组
return 0;
}
返回类型 函数名(函数参数)
函数体
int main()
{
int a = 7 / 2;
int b = 7 % 2;
printf("%d\n", a);//3
printf("%d\n", b);//1
return 0;
}
九、数组
int main()
{
float a = 7 / 2.0;
int b = 7 % 2;
printf("%.2f\n", a);//3.50
printf("%d\n", b);//1
return 0;
}
数组的下标是从0开始的
int main()
{
int a = 0;//初始化
a = 20;//赋值
return 0;
}
打印数组元素
int main()
{
int a = 0;//初始化
a = 20;//赋值
a = a + 3;
printf("%d\n", a);//23
a += 3;
printf("%d\n", a);//26
return 0;
}
小飞机:小飞机_牛客题霸_牛客网
#include
int main()
{
printf(" ** \n");
printf(" ** \n");
printf("************\n");
printf("************\n");
printf(" * * \n");
printf(" * * \n");
return 0;
}
输出学生信息:输出学生信息_牛客题霸_牛客网
#include
int main()
{
printf("Name Age Gender\n");
printf("---------------------\n");
printf("Jack 18 man\n");
return 0;
}
发布信息:发布信息_牛客题霸_牛客网
#include
int main()
{
printf("I lost my cellphone!\n");
return 0;
}
计算表达式的值:计算表达式的值_牛客题霸_牛客网
#include
int main()
{
int a = 40;
int c = 212;
printf("%d\n",((-8+22)*a-10+c/2));
return 0;
}
变长数组
int main()
{
int flag = 0;
if (!flag)
{
printf("hehe\n");//打印
}
return 0;
}
写一个函数求两个整数的较大值
int Max(int x, int y)
{
if (x > y)
return x;
else
return y;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//求两个整数的最大值
int r = Max(a, b);
printf("%d\n", r);
return 0;
}
计算y的值 计算y的值_牛客题霸_牛客网
int main()
{
//输入
int x = 0;
int y = 0;
scanf("%d",&x);
//计算
if(x > 0)
{
y = -1;
}
else if(x == 0)
{
y = 0;
}
else
{
y = 1;
}
//输出
printf("%d\n",y);
return 0;
}
十、 *** 作符
1.算术 *** 作符:+ - * / %
int main()
{
int a = -10;
int b = -a;
printf("%d\n", b);//10
int c = +a;
printf("%d\n", c);//-10
return 0;
}
除号的两端都是整数,执行整数除法;两端有一个浮点数,执行浮点数的除法
int main()
{
int a = 10;
printf("%zu\n", sizeof(a));//4
printf("%zu\n", sizeof(int));//4
printf("%zu\n", sizeof a);//4
//printf("%zu\n", sizeof int);//err
int arr[10] = { 0 };
printf("%zu\n", sizeof(arr));//40,计算的是整个数组大小,单位是字节
printf("%zu\n", sizeof(arr[0]));//4
printf("%d\n", sizeof(arr) / sizeof(arr[0]));//10 计算的是数组的元素个数
return 0;
}
取模的两个 *** 作数只能是整数
2.移位 *** 作符——涉及位的运算,后面讲
3.赋值 *** 作符 =
int main()
{
int a = 10;
int b = a++;//int b = a; a = a + 1;
//后置++,先使用,再++
printf("%d\n", b);//10
printf("%d\n", a);//11
return 0;
}
int main()
{
int a = 10;
int b = ++a;// a = a + 1;int b = a;
//前置++,先++,再使用
printf("%d\n", b);//11
printf("%d\n", a);//11
return 0;
}
4.单目 *** 作符
a + b——双目 *** 作符
单目 *** 作符——只有一个 *** 作数的 *** 作符
C语言中0表示假,非0表示真
int main()
{
int a = 10;
int b = a--;
printf("%d\n", b);//10
printf("%d\n", a);//9
return 0;
}
!——逻辑反 *** 作符
int main()
{
int a = 10;
int b = --a;
printf("%d\n", b);//9
printf("%d\n", a);//9
return 0;
}
+- ——不改变/改变取值的正负
sizeof不是函数,而是单目 *** 作符
int main()
{
//int a = 3.14;//3,14字面浮点数,编译器默认理解为double类型
int a = (int)3.14;
printf("%d\n", a);//3
return 0;
}
int main()
{
int a = 10;
if (a = 3)//赋值而不是判断是否相等
{
printf("hehe\n");//打印
}
return 0;
}
int main()
{
int a = 0;
int b = 20;
if (a && b)
{
printf("hehe\n");//不打印
}
if (a || b)
{
printf("haha\n");//打印
}
return 0;
}
int main()
{
int a = 10;
int b = 20;
int c = 0;
int d = (c = a - 2, a = b + c, c - 3);//c = -2 a = 28 d = 5
printf("%d\n", d);//5
return 0;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int n = 3;
arr[n] = 20;//[]就是下标引用 *** 作符,arr和3就是[]的 *** 作数
return 0;
}
强制类型转换
int Add(int x. int y)
{
return x + y;
}
int main()
{
int sum = Add(2, 3);//()就是函数调用 *** 作符,Add,2,3都是()的 *** 作数
return 0;
}
5.关系 *** 作符
== 判断是否相等
auto int a = 10;//自动变量(可以被省略)
6.逻辑 *** 作符
&& 逻辑与——并且
|| 逻辑或——或者
typedef unsigned int uint;
typedef struct Node
{
int data;
struct Node* next;
}Node;
int main()
{
unsigned int num = 0;
uint num2 = 0;
struct Node n1;
Node n2;
return 0;
}
7.条件 *** 作符(三目 *** 作符)
三目:三个 *** 作数
exp1 ?exp2 : exp3
exp1为真,计算exp2作为整个表达式的结果;exp2为真,计算exp3作为整个表达式的结果
int main()
{
int a = 10;
int b = 20;
int r = (a > b) ? a : b;//r得到a与b的较大值
printf("%d\n", r);
return 0;
}
8.逗号表达式
逗号隔开的一串表达式,从左向右依次计算,整个表达式的结果是最后一个表达式的结果
void test()
{
int a = 1;
a++;
printf("%d\n", a);//打印10个2
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
9.下标引用 *** 作符
void test()
{
static int a = 1;
a++;
printf("%d\n", a);//打印2-11
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
10.函数调用 *** 作符
int g_val = 2022;//另一个源文件中
十一、常见关键字
关键字是C语言本身内置的,不是自己创建出来的,也不能自己创建
extern int g_val = 2022;//声明外部符号
int main()
{
printf("%d\n", g_val);//2022
return 0;
}
变量的名字:有意义 ;必须是字母、数字、下划线组成,不能有特殊字符,同时不能以数字开头;变量名不能是关键字
1.typedef
static int g_val = 2022;//另一个源文件中
类型重命名——别名
2.static(静态的)
extern int g_val = 2022;
int main()
{
printf("%d\n", g_val);//err
return 0;
}
int Add(int x, int y)
{
return x + y;//另一个源文件中
}
static修饰局部变量时,局部变量出了作用域,不会被销毁;本质上,static修饰局部变量的时候,改变了变量的存储位置,影响了变量的生命周期,生命周期变长,和程序的生命周期一样
extern int Add(int x, int y);
int main()
{
int a = 10;
int b = 20;
int z = Add(a, b);
printf("%d\n", z);//30
return 0;
}
static int Add(int x, int y)
{
return x + y;//另一个源文件中
}
extern int Add(int x, int y);
int main()
{
int a = 10;
int b = 20;
int z = Add(a, b);
printf("%d\n", z);//err
return 0;
}
int main()
{
register int num = 3;//建议把3放在寄存器中
return 0;
}
static修饰全局变量的时候,这个全局变量的外部链接属性就变成了内部链接属性。其他源文件就不能再使用到这个全局变量了
#define NUM 100
int main()
{
printf("%d\n", NUM);//100
int n = NUM;
printf("%d\n", n);//100
int arr[NUM] = { 0 };//不报错
return 0;
}
#define ADD(x,y) ((x)+(y))
int main()
{
int a = 10;
int b = 20;
int c = ADD(a, b);
printf("%d\n", c);
return 0;
}
int main()
{
int a = 10;//向内存申请4个字节,存储10
printf("%p\n", &a);
int* p = &a;//p就是指针变量
return 0;
}
char ch = 'w';
char* pc = &ch;
一个函数本来是具有外部链接属性的,但是被static修饰后,外部链接属性就变成内部链接属性了,其他源文件就无法使用了
3.register(寄存器关键字)
电脑上的存储设备——硬盘+内存+高速缓存(cache)+寄存器(集成在CPU上)
上层存储设备空间小,造价高,运算速度快
printf("%zu\n", sizeof(char*));//4
printf("%zu\n", sizeof(short*));//4
printf("%zu\n", sizeof(int*));//4
printf("%zu\n", sizeof(float*));//4
printf("%zu\n", sizeof(double*));//4
十二、#define定义的常量和宏
define定义的常量
struct Stu
{
//成员
char name[20];
int age;
char sex[10];
char tele[12];
};
int main()
{
struct Stu s = { "zhangsan",20,"nan","1596684533" };
//结构体对象.成员名
printf("%s %d %s %s", s.name, s.age, s.sex, s.tele);
return 0;
}
define定义的宏
print(struct Stu* ps)
{
printf("%s %d %s %s", (*ps).name, (*ps).age, (*ps).sex, (*ps).tele);
}
int main()
{
struct Stu s = { "zhangsan",20,"nan","1596684533" };
print(&s);
return 0;
}
宏名(参数,无类型的)宏体
头文件中进行函数的声明、类型的声明、头文件的包含(.h)
源文件中进行函数的实现(.c)
浮点数的四舍五入,不能用肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存
十三、指针
1.内存
为了有效使用内存,内存会被划分为一个个的内存单元(1个内存单元的大小是一个字节),每个内存单元都有一个编号
32位电脑——32位地址线——2^32个地址序列——4G
内存单元的编号——地址——指针
存放指针(地址)的变量就是指针变量
*说明p是指针变量,int说明p指向的对象是int类型的
2.指针变量的大小
不管使用什么类型的指针,都是在创建指针变量
指针变量是用来存放地址的,它的大小取决于一个地址存放的时候需要多少空间
32位机器上的地址——4byte——32bit 所以指针大小4个字节(x86)
64位机器上指针大小8个字节(x64)
十四、结构体
C语言提供了自定义类型的能力——结构体,把单一类型组合在一起
//结构体指针->成员名
printf("%s %d %s %s", ps->name, ps->age, ps->sex, ps->tele);
作业题:
1.swtich语句中没有continue
2.define不是C语言规定的关键字,而是预处理指令
3.计算带余除法 计算带余除法_牛客题霸_牛客网
#include
int main()
{
int a = 0;
int b = 0;
//输入
scanf("%d %d",&a, &b);
//计算
int m = a / b;
int n = a % b;
//输出
printf("%d %d\n", m, n);
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)