基本数据类型
类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节 | 略 |
int | 4字节 | -2147483648 到 2147483647 |
short | 2字节 | -32768到32767 |
long | 4字节 | 0到4294967295 |
float | 4字节 | 6位有效位 |
double | 8字节 | 15位有效位 |
指针
1. 简介
它是一个值,代表一个内存地址。指针变量就是一个普通变量,只不过它的值是内存地址而已。
一个指针指向的可能还是指针,这时就要用两个星号**表示。
int** foo;
2. * 运算符
用来取出指针变量所指向的内存地址里面的值。
void increment(int* p) {
*p = *p + 1;
}
3. & 运算符
用来取出一个变量所在的内存地址
数组
1. 数组简介
数组是一组相同类型的值,按照顺序储存在一起。数组通过变量名后加方括号表示,方括号里面是数组的成员数量。 int scores[100];
!!!!!!!!!!!!!特别注意在声明数组时,必须给出数组的大小!!
2. 数组长度
sizeof
运算符会返回整个数组的字节长度
int a[] = {22, 37, 3490};
int arrLen = sizeof(a); // 12
由于数组成员都是同一个类型,每个成员的字节长度都是一样的,所以数组整体的字节长度除以某个数组成员的字节长度,就可以得到数组的成员数量。
sizeof(a) / sizeof(a[0])
上面示例中,sizeof(a)是整个数组的字节长度,sizeof(a[0])是数组成员的字节长度,相除就是数组的成员数量。
注意,sizeof返回值的数据类型是size_t,所以sizeof(a) / sizeof(a[0])的数据类型也是size_t。在printf()里面的占位符,要用%zd或%zu。
3. 多维数组
C 语言允许声明多个维度的数组,有多少个维度,就用多少个方括号,比如二维数组就使用两个方括号。
int board[10][10];
int c[4][5][6]; 类似的三维数组
4. 变长数组
数组声明的时候,数组长度除了使用常量,也可以使用变量。这叫做变长数组。变长数组的根本特征,就是数组长度只有运行时才能确定。它的好处是程序员不必在开发时,随意为数组指定一个估计的长度,程序可以在运行时为数组分配精确的长度。
任何长度需要运行时才能确定的数组,都是变长数组。(这里的变长指的是数组的长度是在运行时才能决定,但一旦决定在数组的生命周期内就不会再变)
int n = x + y;
int arr[n];
5. 数组的复制
由于数组名是指针,所以复制数组不能简单地复制数组名。
int* a;
int b[3] = {1, 2, 3};
a = b;
上面的写法,结果不是将数组b复制给数组a,而是让a和b指向同一个数组。
字符串
1. 简介
C 语言没有单独的字符串类型,字符串被当作字符数组,即char类型的数组。比如,字符串“Hello”是当作数组{'H', 'e', 'l', 'l', 'o'}处理的。 在字符串结尾,C 语言会自动添加一个全是二进制0的字节,写作\0字符,表示字符串结束。
{'H', 'e', 'l', 'l', 'o', '\0'}
// 等价于
"Hello"
2. 字符串变量的声明
字符串变量可以声明成一个字符数组,也可以声明成一个指针,指向字符数组。
// 写法一
char s[14] = "Hello, world!";
// 写法二
char* s = "Hello, world!";
3. strlen()
函数返回字符串的字节长度,不包括末尾的空子父\0。
char* str = "hello";
int len = strlen(str); // 5
strlen()的原型在标准库的string.h文件中定义,使用时需要加载头文件string.h。 字符串长度(strlen())与字符串变量长度(sizeof()),是两个不同的概念。
4. strcpy()
C 语言提供了strcpy()函数,用于将一个字符串的内容复制到另一个字符串,相当于字符串赋值。该函数的原型定义在string.h头文件里面。
strcpy(char dest[], const char source[]) //第一个参数是目的字符串数组,第二个参数是源字符串数组。
5. strcat()
用于连接字符串。它接受两个字符串作为参数,把第二个字符串的副本添加到第一个字符串的末尾。这个函数会改变第一个字符串,但是第二个字符串不变。
内存地址
1. malloc()
用于分配内存,该函数向系统要求一段内存,系统就在“堆”里面分配一段连续的内存块给它。
以使用malloc()为任意类型的数据分配内存,常见的做法是先使用sizeof()函数,算出某种数据类型所需的字节长度,然后再将这个长度传给malloc()。 int* p = (int*) malloc(n * sizeof(int));
2. free()
free()用于释放malloc()函数分配的内存,将这块内存还给系统以便重新使用,否则这个内存块会一直占用到程序运行结束。
int* p = (int*) malloc(sizeof(int));
*p = 12;
free(p);
struct结构
C 语言提供了struct关键字,允许自定义复合数据类型,将不同类型的值组合在一起。这样不仅为编程提供方便,也有利于增强代码的可读性。C 语言没有其他语言的对象(object)和类(class)的概念,struct 结构很大程度上提供了对象和类的功能。
typedef struct cell_phone {
int cell_no;
float minutes_of_charge;
} phone;
phone p = {5551234, 5};
p.cell_no;
文件操作
- 声明一个文件指针
- 使用fopen()打开指定的文件,并赋值给文件指针
- 使用读写函数,从文件读取数据,写入数据
- 使用fclose()关闭文件,同时清空缓存区
#include <stdio.h>
int main(void) {
FILE* fp;
char c;
fp = fopen("hello.txt", "r");
if (fp == NULL) {
return -1;
}
c = fgetc(fp);
printf("%c\n", c);
fclose(fp);
return 0;
}
EOF
C 语言的文件操作函数的设计是,如果遇到文件结尾,就返回一个特殊值EOF。程序接收到这个特殊值,就知道已经到达文件结尾了
fgetc()
用于从文件读取一个字符。
int fgetc(FILE *stream)
fputc()
用于向文件写入一个字符。
fprintf() fscanf()
常见的数据结构
堆栈(Stack)
只允许在有序的线性资料集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。
常与另一种有序的线性资料集合队列相提并论。
队列(Queue)
是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。
数组(Array)
数组数据结构(英语:array data structure),简称数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引(index)可以计算出该元素对应的存储地址。
链表(Linked List)
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
数(Tree)
树(英语:tree)是一种抽象数据类型(ADT)或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
- 每个节点都只有有限个子节点或无子节点;
- 没有父节点的节点称为根节点;
- 每一个非根节点有且只有一个父节点;
- 除了根节点外,每个子节点可以分为多个不相交的子树;
- 树里面没有环路(cycle)
图(Graph)
图(英语:graph)是一种抽象数据类型,用于实现数学中图论的无向图和有向图的概念。
图的数据结构包含一个有限(可能是可变的)的集合作为节点集合,以及一个无序对(对应无向图)或有序对(对应有向图)的集合作为边(有向图中也称作弧)的集合。节点可以是图结构的一部分,也可以是用整数下标或引用表示的外部实体。
图的数据结构还可能包含和每条边相关联的数值(edge value),例如一个标号或一个数值(即权重,weight;表示花费、容量、长度等)。
堆积(Heap)
堆(英语:Heap)是计算机科学中的一种特别的完全二叉树。若是满足以下特性,即可称为堆:“给定堆中任意节点P和C,若P是C的母节点,那么P的值会小于等于(或大于等于)C的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端的那一个节点,称作根节点(root node),根节点本身没有母节点(parent node)。
散列表(Hash table)
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将所需查询的数据映射到表中一个位置来让人访问,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表==。==
引用来源:
[1] 阮一峰.《c语言入门教程》 C 语言教程 - 网道
[2] 维基百科
[3] 菜鸟网 runoob.com