《C语言基础学习笔记》—— 黑马程序员 <Part1-4>

Posted 开MINI的工科男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《C语言基础学习笔记》—— 黑马程序员 <Part1-4>相关的知识,希望对你有一定的参考价值。

《C语言基础学习笔记 Part1-4》

Part 1 基础介绍

1. 第一个C语言程序:HelloWorld

1.1 编写C语言代码:hello.c

#include <stdio.h>

int main()
{
	//这是第一个C语言代码 
	printf("hello world\\n");
	return 0;
}

C语言的源代码文件是一个普通的文本文件,但扩展名必须是.c。

1.2代码分析

1)include 头文件
  • #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
  • 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
  • 可以通过man 3 printf查看printf所需的头文件

#include< > 与 #include ""的区别:

  • < > 表示系统直接按系统指定的目录检索

  • “” 表示系统先在 “” 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

2)main函数
  • 一个完整的C语言程序,是由一个、且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
  • main函数是C语言程序的入口,程序是从main函数开始执行。
3){ } 括号、程序块和代码块
  • { }叫代码块,一个代码块内部可以有一条或者多条语句
  • C语言每句可执行代码都是";"分号结尾
  • 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
  • 所有的可执行语句必须是在代码块里面
4)注释
  • //叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
  • /**/叫块注释
  • 块注释是C语言标准的注释方法
  • 行注释是从C++语言借鉴过来的
5)printf函数
  • printf是C语言库函数,功能是向标准输出设备输出一个字符串
  • printf(“hello world\\n”); // \\n的意思是回车换行
6)return函数
  • return代表函数执行完毕,返回return代表函数的终止
  • 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
  • 在main函数中return 0代表程序执行成功,return -1代表程序执行失败
  • int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式

1.3编译过程

1.3.1 C语言编译步骤

C代码编译成可执行程序经过4步:

  1. 预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
  2. 编译:检查语法,将预处理后文件编译生成汇编文件
  3. 汇编:将汇编文件生成目标文件(二进制文件)
  4. 链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

1.4 CPU内部结构与寄存器

1.5 集成开发环境IDE

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。

1.5.1 Microsoft Visual Studio

Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等,所写的目标代码适用于微软支持的所有平台。Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。

**VS常用快捷键 **

快捷键含义
Ctrl + k,Ctrl + f自动格式化代码
Ctrl + k,Ctrl + c注释代码
Ctrl + k,Ctrl + u取消注释代码
F9设置断点
F5调试运行
Ctrl + F5不调试运行
Ctrl + Shift + b编译,不运行
F10next调试
F11step调试

Part 2 数据类型

2.1 常量与变量

2.1.1 关键字

C语言共有32个关键字。

  • 数据类型关键字(12个)

char ,short, int, long, float, double, unsigned, signed, struct, union,enum, void,

  • 控制语句关键字(12个)

if, else, swith,case, default,for, do, while, break, continue, goto, return,

  • 存储类关键字(5个)

auto, extern, register,static,const

  • 其他关键字(3个)

sizeof,typedef,volatile

2.1.2 数据类型

数据类型的作用:编译器预算对象(变量)分配的内存空间大小。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNRzydVB-1627308486734)(file:///C:/Users/t480s/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

2.1.3 常量

  • 在程序运行过程中,其值不能被改变的量
  • 常量一般出现在表达式或赋值语句中
类型示例
整型常量100,200,-100,0
实型常量3.14 , 0.125,-3.123
字符型常量‘a’,‘b’,‘1’,‘\\n’
字符串常量“a”,“ab”,“12356”

2.1.4 变量

1)变量

  • 在程序运行过程中,其值可以改变
  • 变量在使用前必须先定义,定义变量前必须有相应的数据类型

标识符命名规则:

  • 标识符不能是关键字
  • 标识符只能由字母、数字、下划线组成
  • 第一个字符必须为字母或下划线
  • 标识符中字母区分大小写

变量特点:

  • 变量在编译时为其分配相应的内存空间
  • 可以通过其名字和地址访问相应内存

2)声明和定义区别

  • 声明变量不需要建立存储空间,如:extern int a;
  • 定义变量需要建立存储空间,如:int b;
#include <stdio.h>

int main()
{
	//extern 关键字只做声明
	//声明一个变量a,a在这里没有建立存储空间
	extern int a;
	a = 10;	//err, 没有空间,就不可以赋值

	int b = 10;	//定义一个变量b,b的类型为int,b赋值为10

	return 0;
}

从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:

  • int b 它既是声明,同时又是定义
  • 对于 extern b来讲它只是声明不是定义

一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。

#include <stdio.h>
#define MAX 10 //声明了一个常量,名字叫MAX,值是10,常量的值一旦初始化不可改

int main()
{
	int a;	//定义了一个变量,其类型为int,名字叫a

	const int b = 10; //定义一个const常量,名为叫b,值为10
	//b = 11; //err,常量的值不能改变

	//MAX = 100;	//err,常量的值不能改变

	a = MAX;//将abc的值设置为MAX的值
	a = 123;

	printf("%d\\n", a); //打印变量a的值

	return 0;
}

2.2整型 :int

2.2.1整型变量的定义和输出

打印格式含义
%d输出一个有符号的10进制int类型
%o(字母o)输出8进制的int类型
%x输出16进制的int类型,字母以小写输出
%X输出16进制的int类型,字母以大写输出
%u输出一个10进制的无符号数
#include <stdio.h>

int main()
{
	int a = 123;	//定义变量a,以10进制方式赋值为123
	int b = 0567;	//定义变量b,以8进制方式赋值为0567
	int c = 0xabc;	//定义变量c,以16进制方式赋值为0xabc

	printf("a = %d\\n", a);
	printf("8进制:b = %o\\n", b);
	printf("10进制:b = %d\\n", b);
	printf("16进制:c = %x\\n", c);
	printf("16进制:c = %X\\n", c);
	printf("10进制:c = %d\\n", c);

	unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值
	printf("有符号方式打印:d = %d\\n", d);
	printf("无符号方式打印:d = %u\\n", d);
	return 0;
}

2.2.2整型变量的输入

#include <stdio.h>

int main()
{
	int a;
	printf("请输入a的值:");

	//不要加“\\n”
	scanf("%d", &a);

	printf("a = %d\\n", a); //打印a的值

	return 0;
}

2.2.3 short、int、long、long long

数据类型占用空间
short(短整型)2字节
int(整型)4字节
long(长整形)Windows为4字节,Linux为4字节(32位),8字节(64位)
long long(长长整形)8字节
  • 需要注意的是,整型数据在内存中占的字节数与所选择的操作系统有关。虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能长于 int 类型。
  • 当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化。但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。
整型常量所需类型
10代表int类型
10l, 10L代表long类型
10ll, 10LL代表long long类型
10u, 10U代表unsigned int类型
10ul, 10UL代表unsigned long类型
10ull, 10ULL代表unsigned long long类型
打印格式含义
%hd输出short类型
%d输出int类型
%ld输出long类型
%lld输出long long类型
%hu输出unsigned short类型
%u输出unsigned int类型
%lu输出unsigned long类型
%llu输出unsigned long long类型
#include <stdio.h>

int main()
{
	short a = 10;
	int b = 10;
	long c = 10l; //或者10L
	long long d = 10ll; //或者10LL

	printf("sizeof(a) = %u\\n", sizeof(a));
	printf("sizeof(b) = %u\\n", sizeof(b));
	printf("sizeof(c) = %u\\n", sizeof(c));
	printf("sizeof(c) = %u\\n", sizeof(d));

	printf("short a = %hd\\n", a);
	printf("int b = %d\\n", b);
	printf("long c = %ld\\n", c);
	printf("long long d = %lld\\n", d);

	unsigned short a2 = 20u;
	unsigned int b2 = 20u;
	unsigned long c2= 20ul; 
	unsigned long long d2 = 20ull; 

	printf("unsigned short a = %hu\\n", a2);
	printf("unsigned int b = %u\\n", b2);
	printf("unsigned long c = %lu\\n", c2);
	printf("unsigned long long d = %llu\\n", d2);

	return 0;
}

2.2.4 有符号数和无符号数区别

1)有符号数

有符号数是最高位为符号位,0代表正数,1代表负数。

#include <stdio.h>

int main()
{
	signed int a = -1089474374; //定义有符号整型变量a
	printf("%X\\n", a); //结果为 BF0FF0BA

	//B       F      0        F       F     0        B	      A
	//1011 1111 0000 1111 1111 0000 1011 1010

	return 0;
}
2)无符号数

无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。

#include <stdio.h>

int main()
{
	unsigned int a = 3236958022; //定义无符号整型变量a
	printf("%X\\n", a); //结果为 C0F00F46

	return 0;
}

当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。

3)有符号和无符号整型取值范围
数据类型占用空间取值范围
short2字节-32768 到 32767 (-215 ~ 215-1)
int4字节-2147483648 到 2147483647 (-231 ~ 231-1)
long4字节-2147483648 到 2147483647 (-231 ~ 231-1)
unsigned short2字节0 到 65535 (0 ~ 216-1)
unsigned int4字节0 到 4294967295 (0 ~ 232-1)
unsigned long4字节0 到 4294967295 (0 ~ 232-1)

2.3 sizeof关键字

  • sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节
  • sizeof的返回值为size_t
  • size_t类型在32位操作系统下是unsigned int,是一个无符号的整数
#include <stdio.h>

int main()
{
	int a;
	int b = sizeof(a);//sizeof得到指定值占用内存的大小,单位:字节
	printf("b = %d\\n", b);

	size_t c = sizeof(a);
	printf("c = %u\\n", c);//用无符号数的方式输出c的值

	return 0;
}

2.4字符型

2.4.1 字符变量的定义和输出

字符型变量用于存储一个单一字符,在 C 语言中用 char 表示,其中每个字符变量都会占用 1 个字节。在给字符型变量赋值时,需要用**一对英文半角格式的单引号(’ ')**把字符括起来。

字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。char的本质就是一个1字节大小的整型。

#include <stdio.h>

int main()
{
	char ch = 'a';
	printf("sizeof(ch) = %u\\n", sizeof(ch)); // sizeof() 输出特定值占用内存的大小,单位:字节

	printf("ch[%%c] = %c\\n", ch); //打印字符
	printf("ch[%%d] = %d\\n", ch); //打印‘a’ ASCII的值

	char A = 'A';
	char a = 'a';
	printf("a = %d\\n", a);		//97
	printf("A = %d\\n", A);	//65

	printf("A = %c\\n", 'a' - 32); //小写a转大写A
	printf("a = %c\\n", 'A' + 32); //大写A转小写a

	ch = ' ';
	printf("空字符:%d\\n", ch); //空字符ASCII的值为32
	printf("A = %c\\n", 'a' - ' '); //小写a转大写A
	printf("a = %c\\n", 'A' + ' '); //大写A转小写a

	return 0;
}

2.4.2字符变量的输入

#include <stdio.h>

int main()
{
	char ch;
	printf("请输入ch的值:");

	//不要加“\\n”
	scanf("%c", &ch);
	printf("ch = %c\\n", ch); //打印ch的字符

	return 0;
}

2.4.3 ASCII对照表

ASCII值控制字符ASCII字符ASCII字符ASCII字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92/124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL

ASCII 码大致由以下两部分组成:

  • ASCII 非打印控制字符: ASCII 表上的数字 0-31 分配给了控制字符,用于控制像打印机等一些外围设备。
  • ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字 127 代表 Del 命令。

2.4.4 转义字符

转义字符含义ASCII****码值(十进制)
\\a警报007
\\b退格(BS) ,将当前位置移到前一列008
\\f换页(FF),将当前位置移到下页开头012
\\n换行(LF) ,将当前位置移到下一行开头010
\\r回车(CR) ,将当前位置移到本行开头013
\\t水平制表(HT) (跳到下一个TAB位置)009
\\v垂直制表(VT)011
\\代表一个反斜线字符""092
代表一个单引号(撇号)字符039
"代表一个双引号字符034
?代表一个问号063
\\0数字0000
\\ddd8进制转义字符,d范围0~73位8进制
\\xhh16进制转义字符,h范围09,af,A~F3位16进制
#include <stdio.h>

int main()
{
	printf("abc");
	printf("\\refg\\n"); //\\r切换到句首, \\n为换行键

	printf("abc");
	printf("\\befg\\n");//\\b为退格键, \\n为换行键

	printf("%d\\n", '\\123');// '\\123'为8进制转义字符,0123对应10进制数为83
	printf("%d\\n", '\\x23');// '\\x23'为16进制转义字符,0x23对应10进制数为35

	return 0;
}

2.5实型(浮点型):float、double

实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比 float 型变量更精确。

由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。

不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。

#include <stdio.h>

int main()
{
	//传统方式赋值
	float a = 3.14f; //或3.14F
	double b = 3.14;

	printf("a = %f\\n", a);
	printf("b = %lf\\n", b);

	//科学法赋值
	a = 3.2e3f; //3.2*1000 = 3200,e可以写E
	printf("a1 = %f\\n", a);

	a = 100e-3f; //100*0.001 = 0.1
	printf("a2 = %f\\n", a);

	a = 3.1415926f;
	printf("a3 = %f\\n", a); //结果为3.141593

	return 0;
}

2.6进制

进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

十进制二进制八进制十六进制
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
16100002010

2.6.1 二进制

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。

当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。

术语含义
bit(比特)一个二进制代表一位,一个位只能表示0或1两种状态。数据传输是习惯以“位”(bit)为单位。
Byte(字节)一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。数据存储是习惯以“字节”(Byte)为单位。
WORD(双字节)2个字节,16位
DWORD两个WORD,4个字节,32位
1b1bit,1位
1B1Byte,1字节,8位
1k,1K1024
1M(1兆)1024k, 1024*1024
1G1024M
1T1024G
1Kb(千位)1024bit,1024位
1KB(千字节)1024Byte,1024字节
1Mb(兆位)1024Kb = 1024 * 1024bit
1MB(兆字节)1024KB = 1024 * 1024Byte

十进制转化二进制的方法:用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。

十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。

2.6.2 八进制

八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。

八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。<

以上是关于《C语言基础学习笔记》—— 黑马程序员 <Part1-4>的主要内容,如果未能解决你的问题,请参考以下文章

C++学习:第一阶段(C++基础入门)———B站黑马程序员C++学习笔记

Python学习笔记---B站黑马程序员

并发编程(学习笔记-共享模型之内存)-part4

小程序基础入门(黑马学习笔记)

Git基础学习(黑马程序员笔记)

Git基础学习(黑马程序员笔记)