(本文为博闻网版权所有,转载必须注明出处。)

指向指针的指针

创建一个指针,使它指向另一个指针,这是可能的,而且常常也是必要的。这一技术有时被称为句柄。在某些情况下,操作系统需要有自主移动堆上的内存块的能力,这时就要用到此技术。下面是一个指针的例子,它指向了另一个指针:

 
int **p;
int *q;

p = (int **)malloc(sizeof(int *));
*p = (int *)malloc(sizeof(int));
**p = 12;
q = *p;
printf("%dn", *q);
free(q);
free(p);

指向指针的指针

Windows和Mac OS使用这种结构支持堆上的内存压缩。应用程序使用指针p,而操作系统负责管理指针*p。因为控制了*p,所以操作系统可以移动*p指向的内存块(**p),并将*p指向新地址,而这一切不会影响使用p的应用程序。在C中,这种指向指针的指针,还常常用于处理函数的指针参数。

指向包含指针结构体的指针
创建一个指针,使它指向一个包含指针的结构体,这也是可能的。下例的代码使用了上一节的Addr记录类型:

 
typedef struct
{
char name[21];
char city[21];
char phone[21];
char *comment;
} Addr;
Addr *s;
char comm[100];

s=(Addr *)malloc(sizeof(Addr));
gets(s->name, 20);
gets(s->city, 20);
gets( s->phone, 20);
gets(comm, 100);
s->comment=
(char *)malloc(sizeof(char[strlen(comm)+1]));
strcpy(s->comment, comm);

指针s指向一个结构体,此结构体又包含一个指向字符串的指针:

指向包含指针结构体的指针

本例中,如果不小心很容易将内存块丢失。例如下面的代码:

 
s=(Addr *)malloc(sizeof(Addr));
gets(comm, 100);
s->comment=
(char *)malloc(sizeof(char[strlen(comm)+1]));
strcpy(s->comment, comm);
free(s);

因为包含指向字符串指针的结构体先于字符串被释放,所以此程序产生了一个内存块泄漏,如下所示:

因为包含指向字符串指针的结构体先于字符串被释放,所以此程序产生了一个内存块泄漏

链接
最后,我们可以创建一种能够指向同类型结构体的结构体,这样就可以链接起一整串同类型的记录,构成一种称为链表的数据结构。

 
typedef struct
{
char name[21];
char city[21];
char state[21];
Addr *next;
} Addr;
Addr *first;

这是可以通过编译的。利用上面的代码,再加上一点编程经验,您就可以创建如下的数据结构:

利用上面的代码,再加上一点编程经验,您就可以创建如下的数据结构




 打印  电子邮件  反馈  引用
编辑推荐
软件狗是什么?
软件狗(Software Dog)是一种计算机软件的加密方式,是“硬件加密锁”的
间谍软件工作原理
您的计算机是否曾变得非常慢,即使打开Word处理器也会占用很长时间,间谍软件可能
什么是路由算法?
路由器是管理网络流量和发送数据包的,但是它是如何决定数据包发送的呢?通过本文,博
Gnutella文件共...
Napster在巅峰时期或许是有史以来最受欢迎的网站。紧随其后的文件共享体系架构
主页 |  公司信息 |  广告服务 |  招聘信息 |  隐私 |  联系我们 |  帮助 |  条款和条件