数据结构中所需的C语言基础

本文将用最通俗的语言,快速讲通数据结构课程(考研408科目)所需C语言的基础知识,帮助长期未复习C语言的同学快速补齐基础,开启数据结构课程的学习。

涉及知识:数组,指针,结构体,及以上相关衍生知识点。

01

一、指针

指针最通俗的,也是大家最常见,最不能理解的,就是指针是存储数据地址,或者说指向某一地址的,这好像是一个很抽象的概念。

可以想象你去朋友家玩,你朋友家有很多房间,每个房间里可以放东西。在C语言里,变量就像是这些房间,房间号就是变量的内存地址,房间里的东西就是变量存的数据。

指针是什么?指针就是一个特殊的变量,它存的不是普通数据,而是另一个变量的房间号。也就是说,指针指向了那个变量的位置。

还是有点抽象,举个例子。假设你有一个房间叫 a,里面放了一个数字 10。现在你拿一张纸条,上面写着 a 的房间号,这张纸条就是指针 。通过这张纸条,你就能找到 a 的房间,看到里面的 10,甚至可以把里面的东西换成别的数字。

看一个具体的C语言代码

复制代码
#include <stdio.h>    int main() {        int a = 10;        // 定义一个普通变量 a,里面放 10        int *p;            // 定义一个指针变量 p,它将来要存某个整数的地址        p = &a;            // &a 就是取 a 的地址(房间号),然后把地址存到 p 里        printf("a 的值是:%d\n", a);     // 直接看 a 房间里的东西        printf("a 的地址是:%p\n", &a);   // a 的房间号        printf("p 里存的地址是:%p\n", p); // p 里存的房间号,跟上面一样        // 通过指针 p 来操作 a 房间        *p = 20;            // *p 的意思是"顺着 p 里的地址找到那个房间",然后把 20 放进去        printf("现在 a 的值是:%d\n", a); // 输出 20,a 已经被改了        return 0;    } 

在定义指针之后,p赋值&a,那么p这个变量本身的值就是a的地址;*p的值就是a的值,*就是解析操作,它解析了p这个地址,找到了a,并解析取出了a的值,所以*p是a的值,p是a的地址;

这里还有一个比较迷惑的地方,看下面两段代码

复制代码
int *p;   p =&a;

复制代码
int *p=&a

以上两个代码是完全相同的意思,但是就有疑惑了

p应该赋值a的地址,*p解析出来是a的值。那第二段代码,怎么将a的地址赋值给了*p,那是不是*p为地址,**p才是解析出来a的值啊。

当然不是,因为int * 就是整数型指针的定义,int *和int的本质是一样的,都是声明类型的,这里int *是一个,p是另外一个,上述疑惑属于断句错误导致的理解困难;

指针跟数组,结构体的联动也是很重要的,下面再讲。

02

二、数组

数组,知道怎么定义基本就差不多了,学过的这个应该不会忘......吧。

数组的初始化大致就这几种形式,当然这里仅以int型的为例

然后需要理解的就是,这里的v,其实可以等价于&v0,也就是v就是数组的首地址。

然后这里就可以结合指针了

v是地址,指针指向地址,这不直接对应了吗

复制代码
int v[10];int *p;p = v;

或者v本身也可以按指针理解

比如v3和*(a + 3)是等价的,和*(p + 3)也是等价的

复制代码
int v[5];for(int i=0;i<7;i++)  printf("%d",*(v+i))

然后数组的遍历赋值,替换等等也很基础,这里简单给几个案例。

复制代码
#include <stdio.h>#include <stdlib.h>#include <time.h>#define SIZE 5int main() {    int arr[SIZE];    int i;    // 方法1:通过循环手动赋值(从键盘输入)    printf("请输入%d个整数:\n", SIZE);    for (i = 0; i < SIZE; i++) {        scanf("%d", &arr[i]);    }    // 遍历输出    printf("数组内容:");    for (i = 0; i < SIZE; i++) {        printf("%d ", arr[i]);    }    printf("\n");    // 方法2:使用随机数赋值(需要随机种子)    srand(time(NULL));    for (i = 0; i < SIZE; i++) {        arr[i] = rand() % 100;  // 生成0~99的随机数    }    printf("随机赋值后的数组:");    for (i = 0; i < SIZE; i++) {        printf("%d ", arr[i]);    }    printf("\n");    return 0;}

03

三、结构体

先看一个案例

复制代码
struct Student {    char name[20];    int age;    float score;};  // 定义结构体类型struct Student stu1 = {"Tom", 18, 90.5};  // 声明并初始化stu1.age = 19;  // 访问成员

在声明结构体之后,struct Student 就是一个,类似int的存在了,stu1就是一个变量,是struct Student 类型的变量。

访问结构体变量需要用:变量名.成员名。

也可以用指针访问结构体

复制代码
struct Student *p = &stu1;p->age = 20;          // 等价于 (*p).age = 20;

这里也可以写成:

复制代码
struct Student *p;p = &syu1

然后->就是指针访问成员变量的运算符,这里p赋值结构体变量stu1的首地址,*p解析,就相当于结构体变量stu1。

到这里,与数据结构相关的C语言基本知识就讲完了,更重要的是去理解指针,结构体的本质。

相关推荐
Tisfy2 小时前
LeetCode 3345.最小可整除数位乘积 I:暴力枚举(从n开始尝试)
数学·算法·leetcode·题解·枚举
DolphinDB智臾科技2 小时前
告别 TB 级数据搬运:DolphinDB 滤波算法库,重塑物联网数据价值链
物联网·算法
可编程芯片开发3 小时前
基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真
算法
Sagittarius_A*3 小时前
后量子密码|通识认知 02|量子威胁核心原理:Shor 算法如何击穿传统公钥密码
算法·信息安全·密码学·量子计算
青山木4 小时前
Hot 100 --- 在排序数组中查找元素的第一个和最后一个位置
java·数据结构·算法·leetcode
其美杰布-富贵-李4 小时前
聚类算法详解:K-means、层次聚类与 DBSCAN
算法·机器学习·kmeans·聚类
碧海银沙音频科技研究院4 小时前
4 BES2710编译环境搭建方法
嵌入式硬件·算法
老师我太想进步了20264 小时前
C语言版讲解函数递归
c语言·开发语言
mifengxing5 小时前
LeetCode 238 除自身以外数组的乘积|无除法O(n)时间+O(1)空间双解法
java·算法·leetcode
依然鸣5 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat