数据结构——C语言知识补充

发布时间 2023-10-07 19:01:52作者: _CRAYON

学数据结构发现代码看不懂 : (
参考资料:
C语言--指针详解 - tongye - 博客园
C语言结构体详解,C语言struct用法详解

指针

C语言的一大难点,如何理解指针和运用指针。
从一个简单的应用说起:
int a = 1;
这是一个简单的变量声明和初始化,定义了一个整型变量a,并赋值为1。
而对于计算机内部,在栈中定义了一个变量a,在内存中,开辟了一个4个字节大小的空间,a就是这个内存空间的标识符号,1就是存储到这个内存空间的值。
printf("%p",&a);
这条语句输出了a在内存的最小地址号,也就是起始地址号。
再到指针
int *p;
声明了一个int 类型的指针 p,int *为类型,变量名为p,声明一个指针变量并不会分配实际的内存空间。
p=&a;
将变量p存入a的地址,实现指针的初始化
printf("%d",*p); //输出1
指针p实际指向了变量a的内存地址,*p则访问了该内存地址的值,所以输出1。
总结:指针是一种保存变量地址的变量,使用指针可以间接访问数据,声明一个指针变量并不会分配任何地址,指针变量本身的内存空间是固定的,位于栈中,使用指针前必须进行初始化,或者动态分配内存,或指向现有的内存。

结构

结构体允许用户自定义可用的数据类型,可以存储不同的数据类型,并通过成员访问运算符(.)进行访问
结构体定义使用关键字struct和结构体名组成

struct BOOK
{
    int a;
    char b;
    double c;
    char *p;
} ;

BOOK 为结构体名,a b c p都为成员变量,Book为结构变量
struct BOOK book1;
这条语句定义了book1变量
同样的定义变量的方法还有将变量放在结构体的最后,这种方法不需要使用结构体名定义其他变量,因此也可以没有结构体名BOOK,但是后面无法用该结构体定义新的变量。

struct
{
    int a;
    char b;
    double c;
    char *p;
} book1;

结构体赋值

  1. 在结构体后面直接赋值

} book1 = {1,a,1.1,"a"};

  1. 对结构体成员赋值

book1.a = 1;

结构与指针

结构体在内存中的存储与数组类似,都是连续存储。
结构指针是指向结构的指针,使用->操作符来访问结构指针成员。

struct Book *struct_pointer;
struct_pointer = &Book;
struct_pointer->a;	//-> 访问指针结构的成员

image.png
这里有点迷茫问了gpt
image.png
结构指针和普通指针一样,只是将结构的起始地址告诉了结构指针变量它所指向的那日村块是一个特定的结构体对象,在之后的代码中就可以通过指针变量来访问结构体对象的成员而不需要重新赋值。

typedef

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称
变量与typedef

// 为类型取一个新的名字
typedef unsigned char BYTE;
BYTE b1,b2;

结构与typedef
回顾上面的结构,调用结构体定义新变量时我们需要
struct BOOK book;
使用typedef我们可以为这个结构起一个别名
typedef struct BOOK book;
book book1;
或者是

typedef struct BOOK 
{
    ...
} book;

book book1;

typedef关键字将结构体BOOK定义为了一个新的类型book。
等同于

struct Book {
    ...
};
struct Book book1;

使用结构体别名可以减少代码中出现的冗余,提高代码的可读性和方便对代码的维护和管理。

数组

数组在各种语言都有使用到,具体的使用方法就不再写。

指针与数组

与结构指针类似,定义一个指针变量,并把数组的第一个元素的地址存储在p中,就可以通过*p *(p+1)来访问数组元素,对数组进行操作。

指针与函数

C语言中可以定义指向函数的指针,也称作函数指针,函数指针指向函数的入口地址。
C语言指针进阶(一)——深入详解“函数指针”与“指针函数”-CSDN博客