当前位置:网站首页>C语言入门笔记 —— 初识
C语言入门笔记 —— 初识
2022-08-05 05:17:00 【Captain林】
很多新入门的小伙伴都想要深入学习C语言,但因为是刚刚接触,大多对C语言没有整体上的认知,因此很容易会在前期钻入牛角尖,耗费大量时间精力,到头来却是“竹篮打水一场空”、“捡了芝麻丢了西瓜”。因此小编在这里为刚接触C语言的同学们准备了一份C语言入门级笔记(包含概括总结),帮助同学们粗略地建立C语言的整体认知。
码字不易,别忘了先赞后看哦!
看完本篇文章,你将会对C语言基础和常识、运行第一个C语言程序、数据类型、变量和常量、字符串、转义字符、注释方法、选择语句、循环语句、函数、数组、操作符、常见关键字、计算机的储存结构和内存分布、宏、指针、结构体有初步的了解。
本篇文章由概念、代码、题目结合的方式组成
目录
13.#define定义常量 (定义的变量如MAX要用大写)
1.C语言基础和常识
1.1 计算机是一门编程语言
计算机是一门编程语言,同时是一门高级语言。计算机语言是由低级语言逐渐演变成高级语言的。
低级语言(二进制机器语言)——>汇编语言(使用类似于add的助记符组成)——>B语言、C语言
1.2 多应用于底层开发
C语言多应用于底层开发,那有很多小伙伴会问了什么叫底层开发呢?其实计算机是如下图自上而下组成
应用软件
操作系统(win/linux)[在操作系统之下的即为底层啦,但注意C语言也可以开发应用软件哦]
驱动软件
电脑——硬件
1.3 ANSI(美国国家标注局制定的C语言标准)
*C89、C99是使用最广泛的C语言标准哦!
*同类还有C99 ...... C11、C17;
1.4 git
知识点1:git是什么?
答:是一个版本管理工具。可以通过git工具上传自己的代码到代码托管网站,例如GitHub、gitee(提交之后可以通过show log查看修改日志)
知识2:linux操作系统
答:国外常用于学术上、科研上、教学。
2.运行第一个C语言程序
2.1 编译器
首先,我们需要有一个属于自己的编译器才能编译运行自己的代码,这里小编用的是vs2022;
vs2022是一个集成开发环境
集成开发环境 = 编辑器 + 编译器 + 调试器
2.2 第一个C语言程序
#include <stdio.h>int main(){printf("hello world\n");printf("he he\n");return 0;}//解释://main函数是程序的入口//一个工程中main函数有且仅有一个
点击ctrl+F5,你的程序将会运行起来。
3.数据类型
问题引入:什么是计算机语言?答:人和计算机交流的语言。
因此计算机语言必须能描述问题,所以创造了数据类型去表示不同事物。
3.1 数据类型
char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点数double //双精度浮点数
3.2 计算机储存大小衡量单位
bit - 比特位
byte - 字节 =8bit
KB -1024
MB -1024
GB -1024
TB -1024
PB ...
.....
3.3 计算字符大小的方法
#include<stdio.h>
*int main() //单位-字节
{
printf("%d",sizeof(char)); //sizoef用于计算字节
return 0;
}
char 1bit(这是他们存储的大小,储存后边小编会讲到哦)
short 2
int 4
long 4
long long 8
float 4
double 8
3.4类型的使用
char ch = 'w';int weight = 120;
4.变量
4.1定义变量的方法
定义变量的方法
int age = 10 //类型(int)+名字(age)
4.2 变量的分类
#include <stdio.h>int global = 2019; //全局变量int main(){int local = 2018; //局部变量//下面定义的global会不会有问题?int global = 2020; //局部变量printf("global = %d\n", global);return 0;}
*局部变量和全局变量名字冲突的情况下,局部优先
4.3 变量的使用
*计算两个数的和
#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;}//这里介绍一下输入,输出语句//scanf//printf
4.4 变量的作用域和生命周期
*作用域,代码的可用范围就是作用域
局部变量的作用域 - 括号内
全局变量的作用域 - 整个工程(即不同源文件的变量也可以相互使用)
extern - 用来声明外部符号(用于全局变量)
*生命周期
*局部变量的生命周期:进去作用域生命周期开始,出去即结束
*全局变量的生命周期:整个程序的生命周期
5.常量
#include<stdio.h>
#define M 100 //3.#difine 定义的标识符常量 - 后面会讲到
{
20; //1.字面常量
int a = 10; //常见字面常量
//2.const修饰的常变量
//const是C语言的一个关键字,是常属性的意思
int num = 10; //可以被修改
const int num = 10; //不可以被修改,赋予了常属性,num本质上还是一个变量,不能用来指定数组大小
return 0;
}
6.字符串 +转义字符+注释
*字符串
字符串类型? - C语言没有
“hehe world” - 但是可以表示字符串
char arr1[] = "a b c" //a b c \0四个元素,字符串结尾隐藏着一个“ \0 ”
char arr2[] = ("a", "b", "c"); //输出之后,abc后会有随机值,读到\0停止
*转义字符(简略版)
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
%d | 整形 |
%s | 打印字符串 |
%s | 打印字符 |
\ddd | \后跟三个八进制数 |
\130 | 代表把130这个八进制数字转化成十进制数字所对应的ascii码值对应的字符,即X |
\xdd | dd代表一个16进制的数 |
*注释
注释后的代码不会被计算机识别,常见注释方法有 “//”和“/*......*/”,多用第一种
*注释-快捷键
ctrl+k+c 注释
ctrl+k+u 取消注释
7.选择语句
if...else语句
题目:输入三个数,判断这三个数大小是否相等
#include<stdio.h>
int main(void)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);//"scanf"是“输入”的意思,&可以理解为取一个地址
if (a == b && a == c)
printf("三个值相等");
else if (a == b || a== c || b==c)
printf("两个值相等");
else
printf("三个值不相等");
return 0;
}
*switch语句
题目:输入一个月份,判断它的季节
#include<stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
switch (a) {
case 3: printf("%d月是春季\n", a); break; //case后的数字必须为常数结果,而不可以是变量
case 4: printf("%d月是春季\n", a); break; //break是退出的意思
case 5: printf("%d月是春季\n", a); break;
case 6: printf("%d月是夏季\n", a); break;
case 7: printf("%d月是夏季\n", a); break;
case 8: printf("%d月是夏季\n", a); break;
case 9: printf("%d月是秋季\n", a); break;
case 10: printf("%d月是秋季\n", a); break;
case 11: printf("%d月是秋季\n", a); break;
case 12: printf("%d月是冬季\n", a); break;
case 1: printf("%d月是冬季\n", a); break;
case 2: printf("%d月是冬季\n", a); break;
default:printf("%d月不存在",a); //default-可以理解为除此之外
}
return 0;
}
8.循环语句
*while循环
题目:逆向显示输入的数值
#include<stdio.h>
int main(void)
{
int a;
scanf("%d", &a);
printf("请输入一个正整数:");
while (a > 0){
printf("%d ", a % 10); //逆向显示整数值,如1234-->4321
a /= 10;
}
return 0;
*for循环
题目:计算1-n的和
计算1-n的和
#include<stdio.h>
int main(void)
{
int a, i, sum;
sum = 0;
printf("n的值是:"); scanf("%d", &a);
for (i = 1; a >= i; i++){ //要用>=,把输入的数也算在里面
sum += i;
}
printf("1到%d的和为%d", a, sum);
return 0;
}
*do while循环
问题:判断输入数是否为正数
#include<stdio.h>
int main(void)
{
int a,b;
do {
puts("请输入一个整数:");
scanf("%d", &a);
if (a == 0)
puts("您输入的整数是0");
else if (a > 0)
puts("您输入的是正数");
else
puts("您输入的是负数");
printf("要重复一遍吗,yes请按0,no请按9:");
scanf("%d", &b);
} while (b == 0);
return 0;
*多重循环(略)
int iq = 0;
while(scanf("%d",&iq) != EOF)
{
if(iq >= 140)
printf("");
}
9.函数
#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;}
10.数组
10.1数组定义
*数组 - 能够存放一组相同类型的元素
*int arr[10] = {1,2,3,4} //初始化的数<=10,后面的元素默认为0
10.2数组的下标
*下标 0,1,2,3 //数组默认有下标
printf("%d\n",arr[3]); //会打印出4,3为下标
10.3数组的使用
#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;}
10.4 初始化、赋值
int a = 20;//初识化
a = 20;//赋值
a += a;//复合赋值运算符
11.操作符
11.1 操作符
*算数操作符 - %
*移位操作符
*位操作符 >>,<<
*位操作符 &,^, |
*单目操作符
1. +-*/ ——运算符
2. ! —— 逻辑反操作符
3. sizeof - 计算操作数的大小(字节)- 操作符
int a = 10;
printf("%d",sizeof(a))= printf("%d",sizeof(int));
4. 前置++,先++,后使用 —— ++a
后置++,先使用,后++ —— a++
5. 前置--,
后置--,
6.强制类型转换
int a= (int) 3.14;
printf("%d",a);
*关系操作符
>
<
>=
<=
==
int a = 0;
if(a = 5) //有bug,建议改成 5==a,能避免bug
{
printf("hehe\n"); //会打印hehe
return 0;
}
&&并且
||或者
*条件操作符(三目操作符)
a : b ? c
int a = 3;
int b = 5;
int m = 0;
//求较大值
m = (a > b) ? (a) : (b);
*下标引用操作符
int arr[10] = {0};
arr[5] = 9; // [ ] - 下标引用操作符
*函数调用操作符
int m = get_max(3,5); // () - 函数调用操作符
11.2 补充(测试,逗号)
*测试代码运行时间
调试开始——F10/Fn+F10
转到反汇编
*逗号表达式
有逗号隔开的表达式,表达式会从左到右依次计算,但是整个表达式的结果是最后一个表达式的结果
12.常见关键字(C语言的关键字不能自己创造)
*关键字
*auto
register - 寄存器
static - 静态的
*switch - case - default
*if - else
*循环
for
while
do while
- break - contine
*类型关键字
void - 空
char
short
int
long
float
double
*常变量
const
*enum - 枚举关键字
*struct - 自定义类型 - 结构体
*union - 联合体
*extern - 声明外部符号
*return - 返回函数
*signed - 有符号的
*unsigned - 无符号
*sizeof - 计算大小
*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; }
*register - 寄存器关键字
register int num2 = 20;//建议将20放在寄存器中
*static修饰局部变量
在C语言中:static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量 (static int a=5,static修饰的变量会储存在静态区,变量不会因为离开作用域而改变,生命周期仍在)
2. 修饰全局变量-称为静态全局变量(一个全局变量本来具有外部链接属性,但是被static修饰后,外部连接属性就变成了内部连接属性,只能在创建变量的源文件使用;)
- 全局变量在大括号以外
- extern 声明某变量来自外部符号(函数-来自于本/另源文件)
- 要在解决方案中点击某个源文件进入,就会运行哪个函数的代码
- 代码运行(编译+链接+执行)
3. 修饰函数-称为静态函数
- 一个函数本来具有外部链接属性,但是被static修饰后,外部连接属性就变成了内部连接属性,只能在创建变量的源文件使用;
使用上感觉作用域变小了
*储存结构
寄存器(寄存到CPU上) 速度快、造价高,空间小
高级缓存 速度自上而下逐渐减慢、造价逐渐降低、空间逐渐增大
内存
硬盘
网盘
*内存分布
-栈区 - 局部变量、形式参数
(局部变量、函数的参数)
-堆区 - 动态内存分配
(动态内存开辟的malloc,realloc,calloc,free)
-静态区 - 静态变量、全局变量 - 静态区中的数据的生命周期和程序的生命周期一致
(static int a=5,static修饰的变量会储存在静态区,变量不会因为离开作用域而改变,生命周期仍在)
13.#define定义常量 (定义的变量如MAX要用大写)
#define MAX 1000
int main()
{
int MAX;
printf("%d\n",m);
return 0;
}
*test.c (程序运行)- 预编译 - 编译 - 汇编 - 链接 - 运行
预处理会用赋值替换变量,如上代码MAX会被替换成1000;
*求较大值
#define MAX(x,y) ((x) > (y) ? (x) : (y))-用括号增加准确度
int m = MAX(a,b);
printf("%d\n",m);
14.指针
14.1内存
*内存是重要的存储器,计算机程序是在内存中运行的
*为了更好使用内存,设计了内存单元,内存单元都有编号,这个编号就是地址,我们把这个地址叫指针
* 一个内存单元是多大? - 一个内存单元是1字节
*内存单元的编号如何产生?
-32位:
32根地址线/数据线,地址线-电线-通电,电信号就可以转换成数字信号(1/0)
00000000000000000000000000000000(32位)
11111111111111111111111111111111 - 共2的32次方个信号
-内存单元都有编号,这个编号就是地址
*//%p - 打印地址(起始地址)
- 会显示最小的那个地址
* int a = 10;
int * pa = &a; //pa 是用来存放地址的,所以我们把pa叫指针变量
(*告诉我们pa是一个指针变量,in告诉我们,pa指向对象是int类型)char ch = 'w';
char * pc = &ch;
*pc= 'q'; // *叫解引用操作符,他的意思是通过pc存放的地址,找到pc指向的内容
(把ch的内容改成'q')
printf("%c\n",ch);//"w"——>"q"
(%c表示输出单个字符)
14.2 一些细节
*一个数字在C语言中是2、4、8个字节,以int类型、float类型和double类型来表示。
int* pa = &a; //int类型占用2字节内存,表示整数
char* pc = &ch;
printf("%d\n",sizeof(pa)); //4
printf("%d\n",sizeof(pc)); //4
*32位平台 指针大小是4个字节
64位平台 指针大小是8个字节
15.结构体(集中属性,结合来描述某一/几件事物)
(typedef重命名)struct Stu //struct描述的变量是结构体变量
{
char name[20]; //名字-字符串
int age; //年龄 - 整数
char sex[5]; //性别(一个汉字占两个字符0
char id[20]; //学号 - 字符串
}(Stu;重命名)void print(struct Stu* ps)
{
printf("%s %d %s %s\n", (*ps).name, )
printf("%s %d %s %s\n",ps->name, )//简便方法
//->结构成员访问操作符
//简便方法:(左边)结构体指针 ->结构体成员(右边)
}int main()
{
//结构体变量struct ...
struct Stu s1 = {"张三",18,"男","2021060701"};
(Stu s2 = (重命名))//输入结构体数据
scanf("%s %d %s %s", s1.name, &(s1.age0, s1.sex, s1,age);
注:因为数组名本来就是地址,因此不用取地址//直接打印(输出)
printf("%s %d %s %s\n", s1.name, s1.age, s1sex, s1.id);//. 结构成员访问操作符
//(左边)结构体变量. 结构体成员(右边)
//使用函数打印(引用上方void print函数)
print(&s2);
}
16.结语
看到这里,相信老铁们对C语言已经有了更深刻的了解。我是计算机海洋的新进船长Captain_ldx,如果我的文章能对您有帮助的话,麻烦各位观众姥爷们点赞、收藏、关注我吧!后期重点注释和知识点将持续更新......
边栏推荐
猜你喜欢
发顶会顶刊论文,你应该这样写作
物联网:LoRa无线通信技术
网络通信及相关函数介绍
[Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)
【shell编程】第三章:函数
原来何恺明提出的MAE还是一种数据增强
Comparison and summary of Tensorflow2 and Pytorch in terms of basic operations of tensor Tensor
【数据库和SQL学习笔记】6.SELECT查询4:嵌套查询、对查询结果进行操作
LeetCode刷题之第24题
【Pytorch学习笔记】10.如何快速创建一个自己的Dataset数据集对象(继承Dataset类并重写对应方法)
随机推荐
dataframe 常用操作
【ts】typescript高阶:映射类型与keyof
全尺度表示的上下文非局部对齐
LeetCode刷题之第701题
MySQL主从复制—有手就能学会的MySQL集群搭建教程
Facial Motion Capture 调研
网管日记:故障网络交换机快速替换方法
【Promise高级用法】实现并行和串行API
LeetCode刷题之第61题
MSRA提出学习实例和分布式视觉表示的极端掩蔽模型ExtreMA
Tensorflow踩坑笔记,记录各种报错和解决方法
基于STM32F407的WIFI通信(使用的是ESP8266模块)
关于使用QML的MediaPlayer实现视频和音频的播放时遇到的一些坑
网络信息安全运营方法论 (上)
LeetCode刷题之第74题
Redis集群(docker版)——从原理到实战超详细
【Multisim仿真】直流稳压电源设计报告
读论文 - Unpaired Portrait Drawing Generation via Asymmetric Cycle Mapping
LeetCode刷题之第416题
哥廷根大学提出CLIPSeg,能同时作三个分割任务的模型