C语言和C++的比较
输入输出
C语言 | C++ | 比较 |
---|---|---|
scanf函数 printf函数 |
cin cout |
cin 和 cout 无需指定输入输出格式, 但消耗的时间比 scanf 和 printf 多得多 |
头文件
内容 | C语言 | C++ |
---|---|---|
输入输出库 | #include <stdio.h> | #include <cstdio> #include <iostream> |
数学函数 | #include <math.h> | #include <cmath> |
字符串有关函数 | #include <string.h> | #include <cstring> |
变量类型
布尔型变量
C语言 | C++ | 比较 |
---|---|---|
#include <stdbool.h> | 可直接使用 | true(存储时为1) false(存储时为0) |
字符串
内容 | C语言 | C++ |
---|---|---|
表示方法 | 通过 字符数组 表示 | 通过 string类 表示 |
字符串长度的表示 | #include <string.h> strlen(str) |
#include <string> str.length() |
字符串拼接 | #include <string.h> strcat(str1, str2); //把str2拼接到str1之后 |
str1 += str2; |
排序函数
- C语言 — qsort
1 |
|
- C++ — sort
1 |
|
cmp函数的区别 | C语言 | C++ |
---|---|---|
返回值类型 | int | bool |
排序的判断 | 返回值 > 0, a 将被排在b后面; 返回值 < 0, a 将被排在b前面; |
默认升序 返回值为true时,a将被排在b前面 |
比较方式 | 元素相减 不能用$>$、$<$比较符(返回无负值) |
$>$、$<$比较符 |
qsort
函数的使用需要运用指针,且写法上没有sort
函数简洁。sort
函数根据具体情形使用不同的排序方法,效率较高,在实现中规避了经典快速排序中可能出现的会导致实际复杂度退化到$O(n^2)$的极端情况。
因此更推荐使用C++的sort
函数进行代码编写。
申请动态内存空间
内存泄露是指申请到的内存空间在使用过后没有释放,导致一些程序内存消耗过快,最后无内存可分配的情况。一般考试中,分配的内存空间在程序结束时即被释放,因此即便不是放空间,也不会产生什么影响,并且内存大小一般也足够一道题的使用。但是从编程习惯上,需要养成即时释放空间的习惯。
C语言
<stdlib.h>
申请内存空间 —
malloc
函数:以需要申请的内存空间为参数,返回指向这块空间的指针,因为返回的指针是
void*
型,因此需要强制转换为对应类型:typename* p = (typename*)malloc(sizeof(typename));
示例:
1
2int* p = (int*)malloc(sizeof(int));
node* p = (node*)malloc(sizeof(node));通常情况下,内存空间的申请不会失败。失败一般发生在使用
malloc
申请了较大的动态数组,如:int* p = (int*)malloc(1000000 * sizeof(int));
。**申请失败会返回空指针NULL
**。释放内存 —
free
函数:以需要释放的内存空间的指针变量为参数:
free(p);
,执行之后,**指针变量p
没有消失,只是指向了空地址NULL
**。
C++
申请内存空间 —
new
运算符:使用new + 类型名即可分配一块该类型的内存空间,返回申请的同变量类型的指针:
typename* p = new typename;
示例:
1
2int* p = new int;
node* p = new node;通常情况下,内存空间的申请不会失败。失败一般发生在使用
new
申请了较大的动态数组,如:int* p = new int[1000000];
。申请失败会发生异常。释放内存 —
delete
运算符:以需要释放的内存空间的指针变量为参数:
delete(p);
,执行之后,**指针变量p
没有消失,只是指向了空地址NULL
**。