【考研】C语言
作者:互联网
考研C语言
收录数据结构会用到的C语言知识,建议有基础的情况下再学习,针对性学习即可。
往后的学习要多从内存角度去学习计算机的知识
1. 数组
1.1 一维数值数组
-
具备相同的数据类型
-
使用过程需要保留原始数据
-
访问越界会改变内存中的原有变量的值
-
数值数组在传递时,元素个数传不过去,只能在函数多定义个变量为Len
1.2 一维字符数组:数组名里存的就是字符数组的起始地址char array[4] = {0}; char* p = array; // *p==array[0]
- char c[10] = "hello";
- 字符数组的内存要预留一个字节作为
\0
结束符 - scanf读取字符串%s时不用加&
- 字符数组在传递时,因为字符数组结尾有
\0
作为结束,因此不用多定义个变量传递长度,除非你不想全部打印 - gets函数和scanf函数类似,puts函数和prinf函数类似。但gets和puts函数只能读取或输出字符串,并且会自动换行
2. 指针
1.1 指针本质:将某个变量的地址保存在内存中(类似俄罗斯套娃)
int* i_pointer = &i;
1.2 指针使用场景
-
传递
-
C语言中形参的传递只是值传递,不会改变原值。但如果要实现更改原值,则要用到指针)
int test(int* a) { *a = 15; } int main() { int a = 10; printf("%d", a); // 10 test(&a); printf("%d", a); // 15 return 0; }
-
-
偏移
-
指针指向地址,根据加减能知道其前后的地址
-
1.3 二级指针
二级指针的初始化一定是一级指针的取地址值
3. 动态内存申请
-
前置内容
- 动态内存申请的空间在堆区域,用完得释放空间
- 堆区域和栈区域的区别:
- 栈区域的内容随着函数的结束而释放
- 堆区域的内容只有在自己用完
free
或进程结束后释放
-
动态内存申请
int i; // 申请空间大小的变量 scanf("%d", &i); char *p; // 用于接收返回的起始地址 p = (char *)malloc(i); // 申请你输入的空间大小,并返回一个起始地址,由p指针接收。由于malloc申请空间的单位是字节,并且是无类型的,因此要指定类型 .... free(p); // 用完后释放动态内存
-
补充
-
野指针就是指针指向的位置不可知的。(随机的、不正确的、没有明确限制的)
-
导致野指针的情况
-
指针未定义
#include <stdio.h> int main() { int* p; //局部变量指针未初始化,默认就是随机值 *p=10; return 0; }
-
指针越界访问
#include <stdio.h> int main() { int arr[10] = {0}; int* p = arr; for(int i=0; i<12; i++) { *p++=i; } return 0; }
-
指针指向的空间已经释放
int* test() { int a = 10; return &a; } int main() { int* p = test(); printf("%d\n", *p); return 0; }
-
-
野指针的规避
- 指针初始化(如果没有就初始化为NULL)
- 小心指针越界
- 指针指向空间释放即设置其为NULL
- 指针使用之前检查其有效性(例如:判断是否为NULL)
-
4. 结构体:管理不同类型的集合
-
声明
struct student { // 放main函数外 int a; char b; ... };
-
初始化
struct student s = {1000, 'c'}; // 函数内初始化
-
使用
s.a , s.b // 访问每一个成员
4.1 结构体数组
-
初始化
struct student array[3];
-
使用
array[0].a , array[0].b // 访问数组[0]中的a,b
4.2 结构体指针
-
初始化
struct student *p;
-
使用
method 1: (*p).a , (*p).b; // 因为.的优先级比*高 method 2: p——>a , p——>b // 比较常用的写法
5. 递归
- 确定递归公式
- 写好结束条件
标签:初始化,10,int,C语言,数组,array,指针,考研 来源: https://www.cnblogs.com/blog-cjz/p/16514825.html