前言
说来惭愧,从大一完了以后接触Java就觉得C好笨啊(其实是我笨,C语言yyds),于是现在重学数据结构的时候,总是遇到C语言的一些问题,今天终于对双重指针有了一定理解,但还有一些问题,待日后学习再解决吧。对了,此问题是由严蔚敏数据结构中,稀疏矩阵压缩存储的十字链表引申而来。
我的理解
首先为了对新手友好,先放如下代码解决一下typedef方面的问题。1
2
3
4
5
6
7
8
9
10
11
12typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
//等价于下面:
//struct LNode{
// int data;
// struct LNode *next;
//}
//typedef struct LNode LNode;
//typedef struct LNode *LinkList;
然后就正式开始解决双重指针的问题啦,我将我的解释写在了注释中,读者可以边读代码边看注释进行理解(当然我的理解也可能有问题,欢迎大家评论告诉我~)。下面代码可以extern到main.c中跑一下,注意头文件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69//
// 双重指针.c
// test
//
// Created by silenceZheng on 2021/7/13.
//
typedef struct ANode{
int data;
struct ANode *next;
}ANode, * ALink;
typedef struct{
ALink *start;
}AList;
int pointerAsArray_int(int data)
{
int* a = (int *) malloc(6*sizeof(int));
a[3] = data;
a[5] = 7;
return a[3];
}
int pointerAsArray_ptr(int data)
{
// 分配空间
AList* alist = (AList *)malloc(sizeof(AList));
ALink* s = (ALink *)malloc(3*sizeof(ALink));
ALink node1 = (ALink)malloc(sizeof(ANode));
ALink node2 = (ALink)malloc(sizeof(ANode));
ALink node3 = (ALink)malloc(sizeof(ANode));
// 赋值
node1->data = 1;
node2->data = 22;
node3->data = data;
node1->next = node2;
node2->next = node3;
node3->next = NULL;
// 这里ALink*与上面int*的实质是一样的,只不过是“指针的指针”,ALink*指向ALink,其值为ALink的地址。
// 由于我分配了3个ALink的空间,所以可以存放3个ALink成为数组。
// 而ALink实质是ANode的指针,也就是结构体指针,所以需要再为ALink指向的东西(ANode)分配空间。
// 这样就构成了AList中ALink*是一个指针,也是一个数组的头指针
// 该数组中的每一个元素都是一个指针,指向一个ANode节点。
// 下面开始将结点放到数组中。
s[0] = node1;
s[1] = node2;
s[2] = node3;
alist->start = s;
// 验证结果
printf("%d\n",alist->start[2]->data);
printf("%d\n",alist->start[0]->data);
printf("%d\n",alist->start[0]->next->next->data);
return 0;
// 说明与问题
// ANode使用链表节点的结构是随便用的,事实上并不对阐述“指针的指针”这一概念有任何帮助。
// 问题1. s[500] = node3; printf("%d\n",alist->start[500]->data);
// 上面语句依然可以正确输出参数值,而实际上我只给ALink指针分配了3个ALink大小的空间。
// 如果这样,那么为ALink*分配空间有什么意义? 或者说分配的空间是固定的?而不分配
// 则有可能丢失数据?
// 问题2. printf("%lu\n",sizeof(ANode));
// printf("%lu\n",sizeof(ALink));
// printf("%lu\n",sizeof(AList));
// 输出结果分别为16、8、8,在我的电脑里int的size是4,为什么ANode是8?
}