目录
目录
目录
什么是C语言
首先c语言是一种语言,人跟机器交互的语言,广泛应用于底层开发。
在最开始,人们对计算机的操控,是通过二进制序列来实现的,也就是机器语言,很明显这种语言让人难以忍受,可以试想用一堆0100100、0001001序列组成的语言编程是多么让人痛苦。于是汇编语言-c语言应运而生,用标识符替代对应的二进制序列,形成一种全新汇编语言。
数据类型
c语言,既然是语言,那么其本质就是一门工具,用来解决问题的工具,正如人一般,通过语言交流发现问题、解决问题。
生活中各式各样的问题,不同的问题,有不同的标签,身高、年龄、性别,不同的问题不同的类型,而在c语言有丰富多样的数据类型用来描述各种问题。
| 名称 | 类型 |
| char | 字符数据类型 |
| short | 短整型 |
| int | 整型 |
| long | 长整型 |
| long long | 更长的整型 |
| float | 单精度浮点型 |
| double | 双精度浮点型 |
char用以描述各种字符,比如定义性别,char s1='男';
short、int、long、long long,这些都是整型,整型数字1、2......,所不同的在于其类型所占内存,对于一些小数字,选用short即可,常规选用int,很长的数字选用long,这样的设置能够充分利用内存,不至于浪费。
float、double,浮点型,顾名思义就是各种小数,只需了解double精度更高,当然所占用内存更大,需要8个字节。
不同数据类型字节大小

字节:计算机计量单位
1byte(字节)=8bit(二进制位)
1KB=1024byte
1MB=1024KB
1GB=1024MB
1TB=1024GB
常量、变量
常量用来表示不变的量,如字面数字、性别等
变量用来表示能发生变化的量,如年龄、身高等
定义变量方式:
int a=0;
char ch='x';
float b=3.14;
double c=6.28;
两个常用函数
scanf()
printf()
前者为输入函数,后者为打印函数,用法如下:
scanf("%d",&x);
printf("%d",x);
printf("hello world");
&x,表示对x取地址,输入数字到x所在的地址,printf打印对应的数值,当然还能够打印其他比如字符串。
打印格式
%d--整型
%s--字符串
%c--字符型
%f--单精度浮点型
%lf--双精度浮点型
变量的作用域和生命周期
作用域:程序设计概念,通常来说,一段代码中所用到的而名字并不是总是有效的,而限定这个名字可用性的代码范围就是这个名字的作用域
1 局部变量的作用域就是变量所在的局部范围
2 全局变量的作用域就是整个工程
全局变量同工程跨源文件,需要声明外部符号,extern;
生命周期:变量的创建到销毁的时间段
局部变量生命周期:进入局部范围到出局部范围
全局变量生命期周:程序生命周期
常量
1 字面常量,能够写出来的量,比如100、c
2 const修饰的常变量
const int n =100;就把n定为100,不能在发生改变,但是其本质仍然是一个变量,只是具备了常属性。
3 #define 定义的标识常量
#define MAX 100
把MAX表示为100,在这个源文件下,打印MAX就是打印100.
4 枚举常量
字符串
字符串就是一串字符,单引号''括起来的就是字符,双引号""括起来的就是字符串。需要注意字符串最后会默认带一个\0作为结束标志。
注释
如果一段代码长时间不回顾,待到下次需要再用,很有可能已经忘了,或者不清晰了,在必要的地方给予注释,方便自己回顾,当然也方便别人理解自己的代码。
c语言注释风格
/* */
这种注释风格有一种缺陷就是不支持嵌套注释,比如,/* /* *\ *\,这样的注释,本来想要 14、23配对,但实际上是 13配对,2被注释掉,4发生错误。
c++注释风格
//
跟着双斜杠后面的一行内容都是注释内容
在目前VS编译器中不管是C还是C++都是支持的,这边建议使用C++注释风格
分支语句
常见有 if else 语句、switch语句;
用法如下
int a=1;
int b=0;
if(a)
{
printf("认真学习,有回报");
}
else
{
printf("摆烂,等于自杀");
}
if()括号中的为真就执行if后续的语句,如果为假就执行else后面的语句,if还能具备嵌套语句用法,这里不过多解释。
switch用法:
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:printf("认真学习,运气不会差的\n");
case 2:printf("你相信网上的摆烂、躺平,那就真没救了\n");
}
循环语句
while()语句
for()语句
do while()语句
首先明确一点,while适合的do while基本都适合,或者说do while适合的 while都适合,他们两者唯一的区别在于,while先判断条件在执行,而do while则是先执行循环然后再判断条件,后者至少会循环一次,即使条件不成立。
int day = 1;
scanf("%d", &day);
while (day < 1000)
{
printf("努力学习 %d\n", day);
day++;
}
if (day >= 1000)
{
printf("恭喜你,学有所成!!!");
}
return 0;
函数
函数是极为重要的一部分,几乎所有的东西都是用函数来实现的,比如main也是一个函数,各种各样的生活软件,都是不同模块的函数,各自执行不同功能,最后集成汇总。
这里简单介绍一下定义函数的方法;
int add(int x,int y)
{
return x + y;
}
int 表示这个函数返回的是整型,add表示这个函数想要实现加法,因为函数很多我们一般用相应的英文名称作为函数名这样有助于记忆,{} 大括号内部就是实现这个加法函数的办法。
函数的定义是在main函数之外,可以再main函数之前,也可以再mian函数之后,如果在main函数之后,则需要声明。
数组
一组相同类型元素的集合就叫数组。
c语言规定,数组的下标从0开始,可以通过访问数组下标,实现对数组的访问。
int arr[10]={0};
arr是数组名,数组名是一个地址;[10]表示这个数组有10个元素;
操作符

关键词
c语言中有多种多样预先设定的关键词,用户不能够自己设定。
char double float int const continue do default enum extern for gote if 等等,各种关键词都有其独特作用,上面不少关键词都已经说过,这里不再赘述。
这里说一个 static
static 静态的
static可以修饰局部变量、全局变量、函数;
void v()
{
static int b = 0;
b++;
printf("%d\n", b);
}
int main()
{
int i = 0;
for (i = 0; i < 5; i++)
{
v();
}
return 0;
}
结果如下:

可以看到本来应该要销毁的变量b,没有销毁,一直保留着,这就是static修饰局部变量之后,改变了其存储类型;
#define和宏
#define ADD(x,y) (x+y)
ADD就是宏
跟函数很像但还是两个东西,这里注意宏的定义全部用大写字母以作区分。
指针
内存是一个大的区域,把他划分成一个一个小的单元,每一个小单元都进行编号。
把内存划分为单元,进行编号(地址)。
一个内存单元大小是一个字节。
CPU会生成一个虚拟地址,有32位、有64位
int* pa=&a;
pa被称为指针变量,用来存放指针或者地址的
地址、指针、编号,三个东西是一样的。
int 表示a是整型
*表示这是一个指针
当你存了一个地址后,你要如何用呢?
*pa,这就表示对pa解引用。*解引用操作符
*pa=20; 这就表示把a的值改成20
再次强调:指针变量是用来存放地址的
总结:
内存会被划分为一个个单元,大小为一个字节,给每一个内存单元编号。这个编号被称为地址或者指针
地址/指针可以存放在一个变量中,这个变量成为指针变量
通过指针变量存储的地址,就能找到指针对应的空间。
pa是一个变量,有自己的空间,只不过这个空间用来存储别人的地址了。

不管是什么类型的,指针大小都是4个字节。好像跟类型没有关系。
指针变量大小是以存什么来决定,指针变量用来存放地址,地址的存放需要多大空间,指针变量的大小就应该是多大。(这里的地址指的地址二进制位数跟机器相关,不是double等类型需要的空间)
32位机器支持32位虚拟空间-产生的地址就是32bit的
64位机器支持64位虚拟空间-产生的地址就是64bit的
前者要存32个bit位的地址,就需要32bit的空间,64同理,所以前者是4个字节,后者是8个字节。
在VS指针大小打印的是4,是因为编译器是32位,当然也可以调整为64位。
通常情况下,地址是不需要存储的,也就不存在用4个字节地址管理1个字节内存会浪费的说法。(比如char就是一个字节)
结构体
char、short、int、long 、float、double等都是内置类型
如何描述生活中的复杂对象,这就需要结构体
struct 创建,在main函数之外创建

定义struct stu不需要空间,但是创建结构体变量需要空间,如后面的s1、s2需要空间。
结构成员访问操作符 :结构体变量.结构体成员
拿地址操作 struct Stu* ps=&s1;
![]()
这两种写法是完全等价的
-> 结构成员访问操作符
![]()
结构体输入,name因为是数组,所以不需要取地址
本文介绍了C语言的基础知识,包括数据类型如char、int、float和double等,以及变量的作用域、生命周期和常量的定义。还提到了字符串的使用、分支语句(if-else和switch)、循环语句、函数的定义和调用,以及数组的概念。此外,文章还讨论了操作符、预定义关键词如static和#define,以及指针的用法,强调指针在内存管理和地址存储中的重要性。
1187

被折叠的 条评论
为什么被折叠?



