C_函数函数是 C 语言的基本构建组件 (building blocks),可以把一个大程序划分为小的组件,从而降低程序的复杂度。使用函数还可以避免编写重复的代码,从而提高程序的可维护性。
函数的定义在C语言中,函数的定义:
返回类型:可以是基本数据类型,也可以是结构体、指针等复合数据类型。不能返回数组,除此之外,函数可以返回任意类型的值。如返回值类型为 void,则函数没有返回值。
函数名称:用于在程序中调用该函数。
参数列表:可以是零个或多个,需要在每个形式参数前面指定它的类型,并且参数之间用逗号分隔。如果函数没有形式参数,应该标明为 void。
函数体:包含声明和语句。在函数体内声明的变量只属于此函数,其它函数不能访问和修改这些变量。
12345return-type function-name (parameters) { declarations statements}
函数调用函数调用由函数名和实际参数 (argument) 列表组成。如:average(x, y)。
非 void 函数调用会产生一个值,该值可以存储在变量中,用于测试、显示,或 ...
C_历史C语言的起源C 语言是贝尔实验室的Ken Thompson、 Dennis Ritchie等人开发的UNIX 操作系统的 “副产品”。Thompson独自编写出了最初版本的 UNIX 操作系统,这套系统运行在只有 16KB内存的 DEC PDP -7计算机上。
UNIX系统最初是用汇编语言编写的,用汇编语言编写的程序往往难以调试和扩展。 Thompson意识到需要用一种更加高级的编程语言来完成 UNIX 系统未来的开发,于是 他设计了一种小型语言—— B语言。 B语言是在BCPL语言(20世纪60年代中期产生的一 种系统编程语言)的基础上开发的,而BCPL语言又可以追溯到最早的语言之一 —— Algol 60。
不久, Ritchie也加入到UNIX项目中,并且开始着手用B语言编写程序。 1970年,贝尔 实验室为UNIX项目争取到一台PDP -11计算机。当B语言经过改进并能够在PDP -11计 算机上运行后, Thompson用B语言重新编写了部分UNIX代码。到了1971年, B语言已 经明显不适合PDP -11计算机了,于是Ritchie着手开发B语 ...
C_指针指针基础指针变量现代计算机都将内存分割为字节,每个字节都有唯一的地址。程序中的每一个变量占一个或多个字节的内存,第一个字节的地址称为是变量的地址。
指针就是地址,而指针变量就是存储地址的变量。(有时候也把指针变量称作为指针)
当指针变量 p 存储变量 i 的地址时, p 指向了 i。
指针变量的声明指针变量的声明与普通变量的声明基本一样,唯一不同的就是必须在指针变量名的前面加上星号:
1int *p;
注意:
指针变量名为 p 而非 * p
指针变量的类型为 int* ,而非 int 类型。
指针变量可以和其它变量一起出现在声明中:
1int i, j, a[10], b[20], *p, *q;
& 和 *获取变量的地址,取地址运算符 & 。访问指针变量所指向的对象,解引用运算符 * 。 p 是指针, *p 就表示 p 当前指向的对象。
取地址运算符 & & 运算符可以获取变量的地址,并可以把变量的地址赋值给指针变量:
123int i, *p;...p = &i;
解引用运算符 *一旦指针变量指向了对象,就可 ...
C_基本数据类型基本数据类型主要包括:整数类型,浮点数类型和字符类型,其中字符类型也可以看作是整数类型中的一种。
整数类型整数类型可以分为两大类:有符号整数和无符号整数。
默认情况下,C 语言的整数类型都是有符号的;若要声明为无符号整数,则需要加 unsigned 关键字。C 语言的整数类型有以下这些:
12345678short (int)unsigned short (int)intunsigned (int) long (int)unsigned long (int)long long (int)unsigned long long (int)
C 语言整数类型的取值范围根据机器的不同而不同。但是编译器都必须遵循的原则:
C 标准规定了 short(2), int(2), long(4), long long(8) 的最小字节长度。
C 标准规定了各个整数类型的字节长度满足下面的关系:
short <= int <= long <= long long
下表是64 位机器上整数类型的常见取值范围:
类型
字节长 ...
C_字符串字符串字面值字符串字面值是用一对双引号括起来的字符序列:
1"To C or not to C, that's the question.\n"
字符串字面值太长而无法放置在一行内,可以用字符 \ 结尾,然后在下一行的开始处延续字符串字面值:
12printf("When you come to a fork in the road, take it. \——Yogi Berra");
字符 \ 可以把两行或者更多行连接成一行。但使用 \ 有一个缺陷:字符串字面值必须从下一行的开始位置书写,破环了程序的缩进结构。
C 语言中当两个或更多个字符串字面值相邻时 (仅用空白字符分割),编译器会把它们合并成一个:
12printf("When you come to a fork in the road, take it. " "——Yogi Berra");
字符串字面值的存储方式C 语言是把字符串字面值作为字符数组来处理的。C 语言会为长度为 n 的字符串字面值分配长度为 n ...
C_排序与查找排序的前提是”比较”,排序的目的往往是”查找”。
排序评估排序算法时间复杂度
最坏时间复杂度:在最不利的情况下,算法执行的时间。通常使用大O符号表示,如O(n²)、O(n log n)等。
平均时间复杂度:算法在随机数据情况下的平均执行时间。通常作为衡量算法效率的主要指标。
最好时间复杂度:在最理想情况下的执行时间,例如,当数组已排序时,算法的复杂度可能更低。
空间复杂度
原地排序:算法是否需要额外的空间来完成排序,影响空间复杂度。
辅助空间:需要额外的存储空间进行辅助处理。
稳定性
稳定排序:两个元素相等,它们在排序后的顺序与排序前相同,称为稳定排序。
稳定排序算法:冒泡排序、插入排序、归并排序、计数排序、基数排序。
不稳定排序算法:选择排序、快速排序、堆排序。
插入排序直接插入排序算法思想构建有序序列。对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。(类似扑克牌)
具体步骤如下:
从数组的第二个元素开始(第一个元素默认是有序的)。
将当前元素与前面已经排好序的元素进行比较,找到适当的位置插入。
重复以上步骤,直到整个数组有序。
代码实现 ...
C_常用数据结构最常用的数据结构有:数组,链表,栈,队列,哈希表和二叉搜索树等。网站推荐 数据结构与算法可视化
链表链表是一种动态数据结构,由一系列节点组成,与数组不同,链表中的元素在内存中不需要是连续的,通过指针将元素串联起来。链表的主要特性是其动态性,即可以方便地进行插入和删除操作,而无需像数组需要移动元素。
链表有多种类型:单链表(Singly Linked List),双向链表(Doubly Linked List),以及循环链表(Circular Linked List)等。
循环链表用的一般比较少,但是当处理的数据具有环形结构时,就特别适合用循环链表(约瑟夫环问题)。
单链表数据结构每个节点包含数据部分和指向下一个节点的指针。
12345678// 定义链表节点结构struct Node { int data; // 数据域 struct Node* next; // 指针域,指向下一个节点};// 初始化链表头指针为 NULLstruct Node* head = NULL;
基本操作
节点插入(头插法):
12 ...
C_数组C语言中的变量可以根据存储的数据类型和结构来分为标量变量和聚合变量。
标量变量(Scalar Variables):标量变量是指单一的数据项,表示单个值。常见的标量类型包括整数、浮点数、字符和枚举等。
聚合变量(Aggregate Variables):聚合变量是指由多个数据项组成的集合,每个数据项可以是标量类型,也可以是其它聚合类型。常见的聚合类型包括数组、结构体和联合体等。聚合变量可以同时保存多个值。
按维度分类一维数组一维数组是一组按照线性排列的元素集合,每个元素都有一个唯一的下标,可以用数组索引来访问数组中的元素。
1type arrayName[arraySize];
数组初始化:
用大括号包含一组常量表达式,常量表达式之间用逗号分隔。
1int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
当初始化式比数组短,剩余元素被初始化为 0,但初始化式不能比数组长,也不能完全为空。
给定了初始化式,可以省略数组的长度:
1int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 1 ...
C_格式化输入/输出输入/输出模型由于硬件设备速度:CPU>>内存>>IO设备
为了平衡内存和 IO 设备之间的速度差异,会在内存中设置缓冲区(buffer),其中就有标准输入缓冲区 (stdin) 和标准输出缓冲区 (stdout)等。
printf函数printf 函数的作用:显示格式串中的内容,并用后面表达式的值替换格式串中的转换说明。
1printf(格式字符串, 表达式1, 表达式2, ...);
格式串中包含普通字符和转换说明。其中,普通字符会原样显示,转换说明则会替换为后面表达式的值。如:
1234567int i, j;float x, y;i = 10;j = 20;x = 43.2892f;y = 5527.0f;printf("i = %d, j = %d, x = %f, y = %f\n", i, j, x, y);
printf函数可以将其它类型的数据转换成字符数据,并输出到stdout缓冲区中。
转换说明转换说明可以对输出格式进行精确的控制。
转换说明的格式为: %m.pX 或 %-m. ...
C_指针的应用动态内存分配动态内存分配是链式结构的基础。可以把动态分配的内存链接在一起,形成链表、树、图等灵活的数据结构。
内存分配函数在 <stdlib.h> 头文件中,三个函数可以进行动态内存分配:
void* malloc(size_t size)
12345 分配 `size` 个字节的内存块,不对内存块进行清零;如果无法分配指定大小的内存块,返回空指针。- ```c void* calloc(size_t nmemb, size_t size)
为有 `nmemb` 个元素的数组分配内存块,其中每个元素占 `size` 个字节,并且对内存块进行清零;如果无法分配指定大小的内存块,返回空指针。
void* realloc(void *ptr, size_t size)
1234567891011121314151617181920 调整先前分配内存块的大小。如果重新分配内存大小成功,返回指向新内存块的指针,否则返回空指针。 `malloc` 效率最高, `malloc` 和 `realloc` 函数的`size`是数组总大小,`calloc` ...