【考研】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函数只能读取或输出字符串,并且会自动换行
  • scanf是标准的输入,存在一个缓冲区。 %d%f%s忽视\n,也就是自动去掉空格。而 %c不会忽视,会保留空格。所以混合输入的时候每次在 %c前都加一个空格
  • scanf有返回值,发生错误时候返回EOF(常量符号为-1),成功则返回个数

2. 指针

1.1 指针本质:将某个变量的地址保存在内存中(类似俄罗斯套娃)

int* i_pointer = &i;

1.2 指针使用场景

  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. 偏移
  2. 指针指向地址,根据加减能知道其前后的地址 https://www.bilibili.com/read/cv6826819/

1.3 二级指针

二级指针的初始化一定是一级指针的取地址值

3. 动态内存申请

  1. 前置内容
  2. 动态内存申请的空间在堆区域,用完得释放空间
  3. 堆区域和栈区域的区别:
    • 栈区域的内容随着函数的结束而释放
    • 堆区域的内容只有在自己用完 free或进程结束后释放
  4. 动态内存申请
int i;  // 申请空间大小的变量
scanf("%d", &i);
char *p;    // 用于接收返回的起始地址
p = (char *)malloc(i);  // 申请你输入的空间大小,并返回一个起始地址,由p指针接收。由于malloc申请空间的单位是字节,并且是无类型的,因此要指定类型
....

free(p);    // 用完后释放动态内存
  1. 补充
  2. 野指针就是指针指向的位置不可知的。(随机的、不正确的、没有明确限制的)
  3. 导致野指针的情况
    • 指针未定义
#include
int main()
{
    int* p; //局部变量指针未初始化,默认就是随机值
    *p=10;
    return 0;
}
+ 指针越界访问
#include
int main()
{
    int arr[10] = {0};
    int* p = arr;
    for(int i=0; i
+ 指针指向的空间已经释放
int* test()
{
    int a = 10;
    return &a;
}

int main()
{
    int* p = test();
    printf("%d\n", *p);
    return 0;
}

【考研】C语言
– 野指针的规避
1. 指针初始化(如果没有就初始化为NULL)
2. 小心指针越界
3. 指针指向空间释放即设置其为NULL
4. 指针使用之前检查其有效性(例如:判断是否为NULL)

4. 结构体:管理不同类型的集合

  1. 声明
struct student {    // 放main函数外
    int a;
    char b;
    ...

};
  1. 初始化
struct student s = {1000, 'c'};     // 函数内初始化
  1. 使用
s.a , s.b   // 访问每一个成员

4.1 结构体数组

  1. 初始化
struct student array[3];
  1. 使用
array[0].a , array[0].b     // 访问数组[0]中的a,b

4.2 结构体指针

  1. 初始化
struct student *p;
  1. 使用
method 1:
(*p).a , (*p).b;    // 因为.的优先级比*高

method 2:
p——>a , p——>b       // 比较常用的写法

5. 递归

  1. 确定递归公式
  2. 写好结束条件

6. 补充

  1. num = p——>num++; // 相当于num = p——>num, (p——>num)++
  2. num=p++——>num; // 相当于num=p——>num, p++

  3. 注意:不用纠结此块内容,这个仅仅服务于机试的时候能看懂表达什么含义即可,初试不考

  4. a = i++ > -1 // 相当于 a = i > -1 , i++两步

Original: https://www.cnblogs.com/blog-cjz/p/16514825.html
Author: 陈景中
Title: 【考研】C语言

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606372/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Nginx笔记

    实现负载均衡 这里采用的是权重 进入配置文件目录cd /usr/local/nginx/conf/ //实际根据自己的目录来 编辑vim nginx.conf 根据需要在此代码的顶…

    Linux 2023年5月27日
    099
  • linux版powershell中,tab补全,linux外部命令参数名,的模块介绍

    关键字 linux powershell pwsh 补全 complete bash zsh 摘要:linux用户的福音!在linux版powershell中,补全linux外部命…

    Linux 2023年6月14日
    090
  • 思科CISCO ASA 5521 防火墙 Ipsec 配置详解

    版本信息: Cisco Adaptive Security Appliance Software Version 9.9(2) Firepower Extensible Opera…

    Linux 2023年6月6日
    097
  • C语言—>指针

    当两个指针 p1, p2相减时, p2-p1就是从 p1到 p2,不包含 p2的元素个数,结果的类型是 ptrdiff_t #include int main() { int a[…

    Linux 2023年6月8日
    087
  • Redis主从复制、哨兵、Cluster三种模式

    Redis作为缓存的高效中间件,在我们日常的开发中被频繁的使用,今天就来说一说Redis的四种模式,分别是 「单机版、主从复制、哨兵、以及集群模式」。 可能,在一般公司的程序员使用…

    Linux 2023年5月28日
    0100
  • 快速构建Web应用,从零学习React后台项目模版

    想要快速构建实际应用,离不开一个好的应用模版,React作为大厂出品工具,有着稳定性和可维护性的保障,同时可以使用相关的全套全家桶(React + React-router + A…

    Linux 2023年5月27日
    092
  • OpenStack-iaas之“先点”云平台安装

    1.认识OpenStack 1.云计算的起源 早在2006年3月,亚马逊公司首先提出弹性计算云服务。2006年8月9日,谷歌公司首席执行官埃里克·施密特(Eric Schmidt)…

    Linux 2023年6月13日
    091
  • 维修数列代码及简易题解

    总体方案:将左右端点分别转到根和根的右儿子,将目标序列挤到以根的右儿子的左儿子为根的子树中,然后进行一系列骚操作即可 建树:用类似线段树的方法建树,递归即可,注意加两个边界点 插入…

    Linux 2023年6月6日
    0122
  • ShardingSphere-proxy-5.0.0建立mysql读写分离之读库负载均衡算法配置(七)

    # Licensed to the Apache Software Foundation (ASF) under one or more contributor license a…

    Linux 2023年6月14日
    0135
  • CSAPP 之 CacheLab 详解

    前言 本篇博客将会介绍 CSAPP 之 CacheLab 的解题过程,分为 Part A 和 Part B 两个部分,其中 Part A 要求使用代码模拟一个高速缓存存储器,Par…

    Linux 2023年6月7日
    0137
  • python_列表

    列表创建 列表类似数组,但是以一对方括号 []作为符号,同时支持-1到-n的下标访问。列表中包含的是元素值的引用 并且,列表中的元素可以不是同一类型的 列表的创建: listNew…

    Linux 2023年6月7日
    0146
  • redis中key和value的存储大小限制

    String类型:一个String类型的value最大可以存储512M List类型:list的元素个数最多为2^32-1个,也就是4294967295个。 Set类型:元素个数最…

    Linux 2023年5月28日
    0134
  • 安卓手机改造服务器——基本环境配置(CentOS7 arm32)

    安装好CentOS系统之后,我们需要对环境进行一些基本的配置,让Linux更好用 注意:本文章是针对 arm32的 CentOS7进行配置的,其他系统或不同架构不要尝试。 1、首先…

    Linux 2023年6月8日
    0113
  • linux正则表达式初探

    为什么要学习正则表达式? 简单而言,仅仅用通配符无法满足处理字符的需求,这时候就是正则表达式大展身手的机会。相较而言,正则表达式比通配符更灵活,也更强大。 我们在网站注册用户的时候…

    Linux 2023年6月7日
    083
  • 分区表、文件系统等计算机基础知识

    开机固件 BIOS UEFI 特别老的BIOS不支持GPT分区 目前已取代BIOS 分区表类型 MBR GPT 1.不支持2TB以上的硬盘2.主分区不能超过4个3.可以通过建立扩展…

    Linux 2023年6月7日
    0101
  • Visual Studio远程调试

    在工作中有时候需要在服务器的环境下远程调试,例如调试微信相关服务的时候。 1. 下载远程调试工具 网址:https://visualstudio.microsoft.com/zh-…

    Linux 2023年6月7日
    0108
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球