c语言指向指针的指针,C语言入门教程-指向指针的指针

指向指针的指针

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

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);

a69b2afadad07b74128e12863cda83fe.gif

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指向一个结构体,此结构体又包含一个指向字符串的指针:

bc7e690cb31a57eb6c75549001751fa2.gif

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

s=(Addr *)malloc(sizeof(Addr));

gets(comm, 100);

s->comment=

(char *)malloc(sizeof(char[strlen(comm)+1]));

strcpy(s->comment, comm);

free(s);

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

fdacea375198cd8449083f26f5608625.gif

链接

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

typedef struct

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

Addr *first;

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

f4748b3578e903f7fbcbf7509eff9111.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值