想要有直升机,想要和你飞到宇宙去........................................................................................
前言
经过一段时间的C语言学习、我有了自己的一些理解和看法,在这里发布博客的目的是记录自己所学习的知识,若能帮助到你,十分荣幸。
3.字符常量:C语言中表示字符和字符串的方法如’a’和”abc”
一、【开端——C语言的引入】
百度上的专业解释我就不粘贴了,这里说说我对C语言的看法,首先,C语言是一门最基础的计算机语言,是人类与计算机进行交流的重要工具,同时它也是很多语言建立的基础。一句话概括它的重要性就是“C生万物”。由于C语言算得上是较为贴近底层的语言,所以对于C语言的学习我们不能单单停留在会使用,对于有些地方更应该知道底层具体是如何实现的。而学会了C语言会让我们在以后学习任何一门不太偏底层的编程语言时都不用花费太大力气。
本篇博客只是简单对C语言的各模块所涉及到的只是进行简单的介绍,后续会有专题进行深入讲解。
二、【数据类型的介绍】
2.1【常见的内置数据类型】
char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数
注:在C语言中1个字节为8个比特位。
注:计算机中存储的数据为二进制形式。
在C语言中是没有字符串数据类型的,一般我们用字符数组来存储字符串。而在C++中就有字符串数据类型string。C语言定义好的数据类型,还远远无法描述我们这个精彩的世界,这就需要我们自定义一些数据类型。这就要使用到我们的结构体相关知识,在本文的最后有结构体相关的知识。
2.2【计算机中单位的介绍】
我们都听说过MB,GB,KB无论是在我们下载游戏还是使用流量数据,这些单位其实都不陌生,下面我们来看一下这些单位之间的具体换算方式:
1PB=1024TB
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024byte
1byte=8bite
然后,字节(bite)是什么呢?这里简单的通过画图然大家简单的了解一下:
当我们讨论计算机中的数据存储单位时,字节是一个常见的单位。字节是计算机中最基本的存储单元,它由8个二进制位(比特)组成。每个二进制位可以表示0或1,因此一个字节可以表示2的8次方即256个不同的值。同时字节也是计算机中最小的单位。
而在这个例子中,我们使用8个方框来表示一个字节。每个方框可以填入0或1,代表一个二进制位。这个字节的值是10110100。
字节的组成可以看作是一个二进制数,它可以表示不同的数据。例如,在计算机中,一个字节可以表示一个字符,如字母、数字或符号。多个字节组合起来可以表示更复杂的数据,如图像、音频和视频。
总结起来,字节是计算机中最基本的存储单位,由8个二进制位组成。它用于表示各种类型的数据,提供了计算机处理和存储信息的基础。
三、【变量】
3.1【变量引入】
什么是变量?我们以前学习过数学当中变量像x,y我们可以用他们表示一些未知的数据,那么C语言中的变量是什么呢?
用于接收外部数据,让一些不断变化的值能够储存起来。
3.2【变量的定义】
1、注意该变量所要定义的数据类型(C语言中对数据类型的要求是严格的,所有变量都要具有类型。)
2、注意变量的名字
变量名最好有意义,如年龄就用age.....
变量名应由字母(大小写均可),数字,下划线构成,长度不应该超过63个字符。变量名中区分大小写,且不能使用关键字进行命名。
对于这里的关键字,在C语言中,关键字(Keywords)是预先定义并保留的标识符,它们具有特殊的含义,并且不能用作变量名、函数名或其他标识符的名称。这些关键字用于定义语言的结构和控制流程。
3.3【变量的分类】
1. 【局部变量】
局部变量是在函数内部声明的变量,它们的作用域仅限于所属的函数或代码块内部
体现局部变量作用域的代码如下:
2. 【全局变量】
全局变量是在函数外部声明的变量,它们的作用域可以延伸至整个程序。
体现全局变量作用域的代码如下:
注:全局变量的作用于整个工程。
3.【局部优先原则】
当局部变量和全局变量同名的时候,优先采取“局部优先”。局部优先"是指在变量名冲突的情况下,程序会优先使用作用域内的局部变量,而不考虑同名的全局变量。
我们可以看到,当main函数和全局当中都存在变量a时,我们可以发现优先使用的是main函数里的a。
4、【变量的生命周期】
【作用域】
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的变量名字并不总是有效的和可用的,而限定这个变量名的可用性范围就是这个变量名的作用域。
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。
【生命周期】
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期,即程序终止了全局变量的生命周期也就结束了。这里所说的生命周期,也就是指一个变量从创建到销毁的时间过程。通常我们用作用域来理解,也就是该变量的作用范围。简单的来说,局部变量的作用域:局部变量所在的局部范围。全局变量的作用域:整个工程。
四、【常量】
什么是常量?单从字面意思上说常量就是不会发生改变的量,而我们以前接触过的常量像自然数字等等。
而C语言中的常量分为以下以下几种:
1、字面常量
2、const 修饰的常变量
3、#define 定义的标识符常量
4、枚举常量4.1【字面常量】
1.整数常量:各种进制形式表示的整数(如:100)
2.浮点数常量(必须为十进制形式):
①小数形式:小数点一般情况下不能省略,当该小数点前后均为零时可以省略(如3.14)。
②指数形式:十进制数+E(e)+十进制整数。
这里如定义float需要注意:
float a=3.14f。因为不加f,编译器默认其为double类型。
3.字符常量:C语言中表示字符和字符串的方法如’a’和”abc”
①普通字符常量:英文单引号所引字符,如:’w’。
②转义字符常量:英文单引号所引且为反斜杠开头的,如:’\n’,’\t’。
③字符串常量:用英文双引号所引的字符串序列,如:”abcd”。用双引号,一个汉字是2个字节,当作字符串来看待。
4.2 【const修饰的常变量】
首先定义const变量:既定义后的变量经初始化后不能再被更改。
下面的代码解析图可以帮助大家理解:
这里a首先被const修饰,并且a在定义的过程中就已经进行了初始化,所以之后不能对a进行修改。
const常量的声明要求: 即const int a=5; 正确
而const int a; a=5; 错误
注:所以当我们使用const去修饰变量时,应该在变量定义的时候就进行初始化。
那么这里有一个容易混淆的问题:
我们知道在C99之前并不支持变长数组,就是指我们在定义数组的时候不指定数组的大小而是直接用一个变量来代替,当我们对该变量实例化的时候数组的大小也就确定了。变长数组的大小是可以使用变量来指定的,但是数据不能初始化。
这里我们举个例子:
这里当我们使用const来修饰变量n,由于我这里并不支持变长数组所以当使用const修饰n时,n只是具有了常属性其本质仍是变量,而我的环境不是C99,所以不支持变长数组进而会报错。
注:
4.3【#define定义的标识符常量】
下面让我们先看一个例子:
代码:
#include<stdio.h> //#define 定义的标识符常量 #define Max 100 int main() { int arr[Max]; #define Min 0 printf("%d\n", Max); //Max = 200; printf("%d\n", Min); return 0; }
4.4枚举常量
先看一个例子:
枚举常量定义的代码:
#include<stdio.h> //声明的一个表示性别的枚举类型 enum Sex { //下面三个符号是Sex这个枚举类型的未来的可能取值 //枚举常量 MALE=5, //0 //这里如果初始化,则第一个成员,默认为0,依次递增;如果初始化了,则按照初始化的数值依次递增下去。 FEMALE,//1 SECRET //2 }; int main() { //enum Sex s = FEMALE; printf("%d\n", MALE); printf("%d\n", FEMALE); printf("%d\n", SECRET); //MALE = 5; return 0; } //%d - 打印整型 //%s- 打印字符串 //%c - 打印字符的
五、【字符串+转义字符+注释】
5.1【字符串】
"hello world\n"
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
5.2【转义字符】
转义字符顾名思义就是转变意思。
下面看一些转义字符:这里同样有一个容易混淆的问题,strlen的时候碰到转义字符是什么样的?
我们知道 单独一个斜杠“ \ ”,不能表示“ \ ”,为了防止有歧义,采用两个反斜杠表示一个反斜杠,所以strlen在计算长度的时候,把两个反斜杠当作一个反斜杠。
更多的情况看下面的例子:
5.3【注释】
1. 代码中有不需要的代码可以直接删除,也可以注释掉
2. 代码中有些代码比较难懂,可以加一下注释文字注释有两种风格:
C语言风格的注释/*xxxxxx*/
缺陷:不能嵌套注释
C++风格的注释//xxxxxxxx
可以注释一行也可以注释多行
5.4【ASCII码】
每个字符都有对应的ASCII码值,既可以通过字符得到其ASCII码值又可以通过ASCII码值得到对应的字符。
ASCII码表
六、【 初识分支循环语句】
主要包含两部分
1.选择语句
选择语句顾名思义就是可以实现选择的语句,那么该如何进行选择呢?
就需要我们使用if关键字,条件1成立就执行if下面的内容,条件2成立就进行if else中的内容,都不成立就执行else中的内容。if(条件1) { } if else(条件2) { } else { }
注意:
这3条语句只会执行1个,也就是说只会在条件1,条件2和else中匹配一次。
除了if 选择语句还有switch case语句
switch (input) { case 1: break; case 0: break; default: break; }
主要看input的对应值,如果为1,就执行case1,为0就执行case0,都不是就会执行defult,
switch case语句经常在菜单中使用。
看一个例子:
//if语句,switch语句。 int main() { int a = 1; if (a == 0) { printf("%d\n", a); } else { printf("false\n"); } int input = 0; do { menu(); printf("请选择>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏"); break; default: printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
2.循环语句
循环语句就表示一直处于一个循环当中,具体由以下3种形式:
//1、 while(条件) { } //2、 for(;条件;) { } //3、 do { }while(条件)
循环语句就表示循环语句中的代码会被循环执行。
看一个例子:
//while循环,for循环,do while循环。 int i = 10; while (i!=0) { printf("%d ", i); i--; } for (int i = 0; i < 10; i++) { printf("%d ", i); } do { i--; printf("%d ", i); }while(i!=0)
具体用法请参考博客:
七、【初识C语言函数】
我们学过数学当中的函数,一般表示自变量和因变量之间的映射关系,而C语言中的函数则有些不同,这里的函数主要是用来帮助我们完成某些特定功能而存在的,这样我们在需要这些功能时,不用在重新实现,而只需要调用对应函数即可。
这里拿个代码举例子:
#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; }
后面会详细介绍具体见:
八、【初识数组】
数组就类似于之前学过的集合,你可以想象成就是一组同类型的数字排列在一起就构成了数组。
C语言中给了数组的定义:一组相同类型元素的集合。
8.1【数组的定义】
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
这里可以不给定大小,但是需要初始化。
也可以给定大小但是不初始化。
8.2【数组的下标】
C语言规定:数组的每个元素都有一个下标,下标是从0开始的,数组可以通过下标来访问的。
如上面的:
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//如果数组10个元素,下标的范围是0-9
8.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; }
具体使用还请参考:
【C语言数组】-CSDN博客
九、【初识操作符】
算术操作符
+ - * / %
移位操作符
>> <<
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数的类型长度(以字节为单位) ~ 对一个数的二进制按位取反 -- 前置、后置-- ++ 前置、后置++ * 间接访问操作符(解引用操作符) (类型) 强制类型转换 关系操作符 > >= < <= != 用于测试“不相等” == 用于测试“相等” 逻辑操作符 && 逻辑与 || 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号表达式
exp1, exp2, exp3, …expN
下标引用、函数调用和结构成员
[] () . ->
具体见:
十、【初识关键字】
关键字(Keywords)是预先定义并保留的标识符,它们具有特殊的含义,并且不能用作变量名、函数名或其他标识符的名称。这些关键字用于定义语言的结构和控制流程。
常见关键字:
1.数据类型关键字 (1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 (4) float:声明浮点型变量或函数 (5) int: 声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 (10) union:声明共用体(联合)数据类型 (11) unsigned:声明无符号类型变量或函数 (12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) 2.控制语句关键字 A循环语句 (1) for:一种循环语句(可意会不可言传) (2) do :循环语句的循环体 (3) while :循环语句的循环条件 (4) break:跳出当前循环 (5) continue:结束当前循环,开始下一轮循环 B条件语句 (1)if: 条件语句 (2)else :条件语句否定分支(与 if 连用) (3)goto:无条件跳转语句 C开关语句 (1)switch :用于开关语句 (2)case:开关语句分支 (3)default:开关语句中的“其他”分支 D返回语句 return :子程序返回语句(可以带参数,也看不带参数) 3.存储类型关键字 (1)auto :声明自动变量 一般不使用 (2)extern:声明变量是在其他文件正声明(也可以看做是引用变量) (3)register:声明积存器变量 (4)static :声明静态变量 4.其他关键字: (1)const :声明只读变量 (2)sizeof:计算数据类型长度 (3)typedef:用以给数据类型取别名(当然还有其他作用 (4)volatile:说明变量在程序执行中可被隐含地改变
C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己是不能创造关键字的。
10.1【关键字typedefine】
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; }
10.2【关键字static】
在C语言中:
static是用来修饰变量和函数的
1. 修饰局部变量-称为静态局部变量
2. 修饰全局变量-称为静态全局变量
3. 修饰函数-称为静态函数4.static修饰局部变量改变了变量的生命周期
5.让静态局部变量出了作用域依然存在,到程序结束,生命周期才结束。6.一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。也就是说全局变量本来具有外部链接属性static会将外部连接属性修改为内部链接属性。
7.一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
8.被static修饰的变量无论是局部变量还是全局变量都存放在内存中的静态区。
十一、【#define 定义常量和宏】
1#define可以定义标识符常量和宏,也就是说可以理解为为常量起一个名称,当使用该名称时本质上使用常量,而宏可以理解为表达式起一个名称,而表达式包含的成员也应出现在名称以内,请看下面的例子:
//define定义标识符常量 #define MAX 1000 //define定义宏 #define ADD(x, y) ((x)+(y)) #include <stdio.h> int main() { int sax=MAX;//1000 printf("sax = %d\n", sum); sum = 10*ADD(2, 3);//10*((2)+(3)) printf("sum = %d\n", sum); return 0 }
需要注意的是这里的宏是直接进行替换即直接将名称替换为对应表达式,具体要点和细节请参考:
十二、【初识指针】
12.1【内存】
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。内存可以细分为以下情况:以后在详细介绍
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。
比如:
#include <stdio.h> int main() { int num = 10; #//取出num的地址 //注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址) printf("%p\n", &num);//打印地址,%p是以地址的形式打印 return 0; }
那么地址是如何产生的呢?
12.2【指针及其使用】
而地址如何存储,则需要定义指针变量
int num = 10; int *p;//p为一个整形指针变量 p = #
指针的使用实例:
#include <stdio.h> int main() { int num = 10; int *p = # *p = 20; return 0; }
以整形指针举例,可以推广到其他类型,如:
#include <stdio.h> int main() { char ch = 'w'; char* pc = &ch; *pc = 'q'; printf("%c\n", ch); return 0; }
12.3【指针变量的大小】
指针变量的大小取决于地址的大小
32位平台下地址是32个bit位(即4个字节)
64位平台下地址是64个bit位(即8个字节)可通过sizeof进行查看:
int a=10; int* ptr=&a; int sz=sizeof(ptr); printf("%d\n",sz);
结论:指针大小在32位平台是4个字节,64位平台是8个字节。
更多详细的内容参考:
十三、【初识自定义类型】
13.1【结构体】
结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。那么什么是结构体呢?
实际上现实生活中除了数字,字符串这些简单的数据类型以外,还有像“人”,“学生”这些嗲有多种属性的名词,如果要定义一个变量来表示这些复杂的名词,就需要使用到结构体。
比如描述学生,学生包含: 名字+年龄+性别+学号 这几项信息。
这里只能使用结构体来描述了。例子:
struct Stu { char name[20];//名字 int age; //年龄 char sex[5]; //性别 char id[15]; //学号 }; int main() { struct Stu s = {"张三", 20, "男", "20180101"}; //.为结构成员访问操作符 printf("name = %s age = %d sex = %s id = %s\n", s.name, s.age, s.sex, s.id); //->操作符 struct Stu *ps = &s; printf("name = %s age = %d sex = %s id = %s\n", ps->name, ps->age, ps->sex, ps->id); return 0; }
13.2【枚举类型】
它一种用户定义的数据类型,它允许你为整数值指定一个容易记忆的名字。这在编程中非常有用,尤其是当你需要表示一组固定的、有限的整数值时。
举个例子:
enum Day//星期 { Mon,//0,0 Tues,//1 Wed,//2 Thur,//3 Fri,//4 Sat,//5 Sun//6 };
13.3【联合体】
在C语言中是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型。但是,与结构体(Struct)不同的是,结构体中的每个成员都拥有自己独立的内存空间,而联合体中的所有成员都共享同一块内存空间。因此,同一时间只能存储联合体中的一个成员的值。
可以这样理解,比如我们大学里的辅导员,她在管理我们生活方面充当辅导员的角色,而在教学方面,她又充当某个学科的讲师,其实这里就是一个联合体,其中“辅导员”,“讲师”共同占用一个空间。
union Un { char c; int i; };
更多细节及要点请参考:
【C语言中的自定义类型】-CSDN博客
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C语言中的一些知识,只简单的对C语言中的知识进行了解,而C语言还有很多更加有趣,神奇的知识,在等着我们。
.....................................................................................................透明的,让我感动的
—————《可爱女人》