C语言入门笔记摘要

基本数据类型

类型存储大小值范围
char1 字节
int4字节-2147483648 到 2147483647
short2字节-32768到32767
long4字节0到4294967295
float4字节6位有效位
double8字节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;

文件操作

  1. 声明一个文件指针
  2. 使用fopen()打开指定的文件,并赋值给文件指针
  3. 使用读写函数,从文件读取数据,写入数据
  4. 使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值