C 语言概述

什么是程序

程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合

1
2
3
4
5
6
#include <stdio.h>

void main(){

printf("Hello,world!")
}

什么是 C语言

C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。最新的C语言标准是C18

C语言特点

  1. 代码级别的跨平台:由于标准的存在,使得几乎同样的 C 代码可用于多种操作系统,如 Windows、DOS、UNIX 等等;也适用于多种机型
  2. 使允许直接访问物理地址,对硬件进行操作: 由于 C 语言允许直接访问物理地址,可以直接对硬件进行操作, 因此它既具有高级语言的功能,又具有低级语言的许多功能,C 语言可用来写系统软件(比如操作系统, 数据库, 杀毒软件,防火墙, 驱动, 服务器程序)
  3. C 语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言
  4. C 语言传递参数可以是值传递(pass by value,值),也可以传递指针(a pointer passed by value, 地址)
  5. C 语言中,没有对象,不同的变量类型可以用结构体(struct)组合在一起
  6. 预编译处理(preprocessor), 生成目标代码质量高,程序执行效率高

开发工具

Visual Studiohttps://visualstudio.microsoft.com/zh-hans/vs/

B/S 和C/S 架构的定义和区别

B/S 架构软件

B/S(Browser-Server)浏览器和服务器架构。 (比如百度、微博、淘宝等网站)

包含客户端浏览器、web应用服务器、数据库服务器的软件系统。用户只需要一个浏览器就可以访问服务。

系统更新时候,只需要更新服务端,不需要更新浏览器

C/S 架构软件

C/S(Client-Server)客户机和服务器结构。(比如微信、王者荣耀手游,QQ音乐等软件)。

C/S结构与B/S最显著的区别是需要安装客户端,通过客户端程序来访问应用系统。

系统更新时,既要更新服务端,也要更新客户端。

C程序快速开发

创建C程序,输出“Hello,world!”

开发步骤

  • Visual Studio 创建空项目

  • 新建源文件 hello.c

    1
    2
    3
    4
    5
    #include <stdio.h>
    void main(){
    printf("Hello,world!");
    getchar;
    }
  • 点击 执行(不调试) 按钮运行程序

C 程序运行机制

运行机制简述

  1. 编辑:编写 hello.c 源代码
  2. 编译:将 hello.c 程序 翻译成 目标文件(hello.obj)//在计算机底层执行
  3. 链接:将目标文件 hello.obj + 库文件 生成可执行文件 .exe //在计算机底层执行
  4. 运行:执行 .exe 文件,得到运行结果

编译、链接和运行详解

什么是编译

  • C源文件 通过 编译器 将其编辑成 .obj文件(目标文件)

什么是链接

  • 目标文件(.obj文件),通过 链接程序C库文件 链接成 .exe(可执行文件)

什么是运行

  • 可执行的exe文件,也称为可执行程序(二进制文件)
  • 在控制台下可以直接运行 exe 文件

开发注意事项

  1. C程序的主体结构说明

    1
    2
    3
    4
    5
    #include <stdio.h>
    void main(){ // {}内包括内容,称为函数体
    语句1
    语句2
    }
  2. C程序源文件以 “.c” 为扩展名

  3. main()函数 是c程序的执行入口

  4. C 语言 严格区分大小写

  5. C 程序 由许多条语句构成,每个语句以 “ ; ” 结束

  6. 大小括号都是 成对 出现,缺一不可

  7. 修改源文件后,需要重新编译链接,生成新的exe文件后,才能生效

C 语言代码规范

注释

单行注释

  • 基本格式
    • 格式://注释文字

多行注释 (块注释)

  • 基本格式
    • 格式:/* 注释文字 */
    • 多行注释不允许嵌套

代码缩进风格

行尾风格

1
2
3
4
5
6
7
int max(int a,int b){
if(a>b){
return a;
}else{
return b;
}
}

次行风格

1
2
3
4
5
6
7
8
9
10
11
int max(int a,int b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}

C 语言标准库

C 标准库是一组 C 内置函数、常量和头文件,比如 <stdio.h>、<stdlib.h>、<math.h>,等等。这个标准库可以作为 C 程序员的参考手册。

参考手册:https://www.runoob.com/cprogramming/c-standard-library.html

C 转义字符

C 常用转义字符

转义字符 释义
\t TAB(水平制表符),一个制表位,实现对其功能
\n 换行符
\\ 一个 \
\“ 一个 “
\‘ 一个 ‘
\r CR(回车),一个回车

C 占位符

占位符 数据显示类型 来源单词
%d 有符号整数 digit
%f(%.2f) 浮点数 float
%c 字符 character
%s 字符串 string

C 占位符

C 变量

C 变量概念:

变量其实只不过是 程序可操作的存储区(内存) 的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。

变量三要素(变量名称+数据类型+值)

C 变量注意事项:

变量名称 可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的, C 严格区分大小写。

变量必须先声明,后使用

变量数据可以在数据类型范围内不断变化

变量在同一个作用域内不能重名

1
2
3
4
5
6
7
8
9
#include <stdio.h>
void main() {
int num; // 定义变量类型 int
num = 2; // 给变量赋值
printf("num = %d\n",num);

int num_2 = 2; // 定义一个名为 num_2 的 整型变量 并赋值 2
printf("num = %d\n", num_2);
}

C 变量数据类型

image-20221216222202935

在 C 中,没有字符串类型,使用字符数组表述字符串

整数类型

类型 存储大小 值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

整型使用细节:

各种类型的存储大小与操作系统、系统位数和编译器有关,目前以64位系统为主。

img

C 语言的整型类型,分为有符号 signed无符号 unsigned 两种,默认是 signed

byte(字节):计算机中基本储存单元;bit(位):计算机中的最小储存单元。 1byte = 8 bit

1
2
3
4
5
6
#include <stdio.h>
void main(){
int num = 2147483647;
printf("num = %d\n", num); // 表达式 sizeof(type) 得到对象或类型的存储字节大小。
printf("int 字节大小 = %lu \n", sizeof(int)); // 输出 int 字节大小 = 4
}

浮点类型

类型 存储大小 值范围 精度
float 4 字节 1.2E-38 到 3.4E+38 6 位有效位
double 8 字节 2.3E-308 到 1.7E+308 15 位有效位
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位有效位

浮点型使用细节:

浮点型默认为 double 型,声明 float 型常量时,须后面加 ‘f’ 或 ‘F’。

通常情况下,应该使用 double 型,更加精准。

printf(“d1 = %f”, d1); // %f 在输出时默认保留小数点6位(%.6f)。

浮点型两种表示方式:

​ 十进制数形式:例 5.12 512.0f .512(必须有小数点)

​ 科学计数形式:例 5.12e2 5.12E-2

字符类型(char)

字符类型可以表示单个字符,字符类型是 char,char 是 1 个字节(可以存字母或者数字)。

多个字符称为字符串,在 C 语言中 使用 char 数组 表示,数组不是基本数据类型,而是构造类型。

字符类型使用细节:

字符常量时用单引号('')括起来的单个字符。例 char c1 = ‘a’; char c2 = ‘1’;

char转义字符'\'。例 char c3 = ‘\n’ // ‘\n’ 表示换行符

C 中,char 的本质时一个整数,对应ASCII码的对应字符输出。

给char 赋值一个整数,会按照ASCII码对应字符输出。例 char c4 = 97; // 输出 c4 = a

char 类型相当一个整数,可以进行运算。

字符型 存储到 计算机中,需要将字符对应的码值(整数)找出来

存储:字符’a’——>码值 (97)——>二进制 (1100001)——>存储()

读取:二进制(1100001)——>码值(97)——> 字符’a’——>读取(显示)

ASCII码

image-20221217225536703 image-20221217225628820

布尔类型

bool 表示布尔型变量,也就是逻辑型变量的定义符。

C 语言标准(C89)没有定义布尔类型,所以 C 语言判断真假时以 0 为假,非 0 为真。

bool 取值 false 和 true,0 为 false,非 0 为 true

布尔类型常用在 条件控制语句:if...循环控制语句:while...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

// 宏定义
#define BOOL int
#define TURE 1
#define FALSE 0

void main() {
BOOL isok = TURE; // 等价于 int isok = 1;

if (isok) {
printf("ok");
}

getchar();
}

C99中提供了一个头文件 <stdbool.h> 定义了bool代表_Bool,true代表1,false代表0。只要导入 stdbool.h ,就能非常方便的操作布尔类型了。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 1 #include <stdio.h>
2 #include <stdbool.h>
3
4 int main(int argc, char **argv)
5 {
6 int n = 10;
7 int sum = 1;
8 bool flag = false;
9 int num = n;
10 while( !flag){
11 sum = sum * (num--);
12 if(num == 1){
13 flag = true;
14 }
15 }
16 printf("%d value %d\n", n, sum);
17
18 return 0;
19 } // 输出结果 10 value 3628800

基本数据类型转换

自动类型转换

在 C 程序进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,就是自动类型转换。

数据类型按精度(容量)大小排序:

数据类型按精度(容量)大小排序

数据类型自动转换表规则:

image-20221218113343903

  • 自动类型转换细节说明:
    1. 有多种类型的数据混合运算时,系统首先自动将所有数据转换成 精度最大 的那种数据类型,然后再进行计算(例 short 型和 int 型运算时,先把short转成int型后在进行运算)。
    2. 若两种类型的字节数不同,转换成字节大的类型,若两种类型的字节数相同,且一个有符号,一种无符号,则转为无符号类型
    3. 在赋值运算中,等号两边的数据类型不同时,右边类型将转换为左边类型,如果右边数据类型比左边的数据类型长时,将丢失一部分数据,会降低精度,丢失部分按四舍五入向前舍入。

强制类型转换

将精度高的数据类型转换为精度小的数据类型,使用时加上 强制转换符() ,注意!!!可能造成精度降低或溢出.

强制类型转换格式;

(类型名)表达式 例 int num = (int)d1;

强制类型转换操作不改变操作数本身

  • 强制类型转换细节说:

    1. 当数据从 高精度 --> 低精度,就需要使用强制转换
    2. 强制转换符号只针对最近的表达式有效,往往会使用小括号提升优先级
    1
    2
    int num4 = (int)3.5 * 10 + 1.5 * 6;  // 等价于 3 * 10 + 1.5 * 6  = 39 
    int num5 = (int)(3.5 * 10 + 1.5 * 6); // 使用小括号提升优先级 35 + 9 = 44

指针入门

基本介绍:

指针就是内存地址,每一个变量都有一个内存位置,每一个内存位置都定义了可使用 & 运算符访问的地址,它表示了在内存中的一个地址。

输出变量地址使用:%p 例: int num = 1; printf("num地址是:%p", &num);

1
2
3
4
5
6
7
8
9
10
11
12
13
int num = 100;
int* prt = &num;
// int* prt; int* 表示类型为 指针类型 名称 prt
// prt = &num; prt 指向一个 int 类型变量的地址

//说明1: 要输出一个变量的地址,使用 %p
//说明2: &num 表示取出num这个变量的对应地址
pintf("num = %d num地址:%p", num, &num);

//指针变量,本身也有地址 &prt
//指针变量,存放的地址 prt
//指针变量,指向的值 *prt
printf("prt的地址:%p prt存放的值:%p prt指向的值:%d", &prt, prt, *prt);

指针细节说明:

image-20221218222508828
  • 基本类型,都有对应的指针类型

  • 指针的类型必须与变量的类型一致 (int类型对应int* ,float对应float….)

    1
    2
    3
    4
    int    *ip;    /* 一个整型的指针 */
    double *dp; /* 一个 double 型的指针 */
    float *fp; /* 一个浮点型的指针 */
    char *ch; /* 一个字符型的指针 */
  • 其他类型指针:指向数组指针, 指向结构体的指针, 指向共用体的指针, (二级指针, 多级指针)

值传递和地址传递

C 语言传递参数(或者赋值)可以是**值传递(pass by value),也可以是传递指针(a pointer passsed by value)**,传递指针也叫地址传递。

  1. 默认传递值的类型:基本数据类型(整数类型、小数类型、字符类型),结构体,共用体。
  2. 默认传递地址的类型:指针、数组。

值传递:将变量指向的存储内容,在传递/赋值时,拷贝一份给接收变量。

image-20221219140924459

地址传递(指针传递):如果是指针,就将指针变量存储的地址,传递给接收变量;如果是数组,就将数组的首地址传递给接收变量。

image-20221219150612406