码迷,mamicode.com
首页 > 其他好文 > 详细

对于链表的链式存储的初始化操作,遇到的有关“二级指针”的知识小结

时间:2015-04-04 12:04:48      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

首先解释一下“二级指针”:

一级指针所关联的是其值(一个地址)名下空间里的数据,这个数据可以是任意类型并做任意用途,但二级指针所关联的数据只有一个类型一个用途,就是地址。

指针就是两个用途:提供目标的 读取 或 改写, 那么二级指针就是为了提供对于内存地址的读取或改写。

指针的表现形式是地址,核心是指向关系指针,运算符“*”的作用是按照指向关系访问所指向的对象.
如果存在A指向B的指向关系,则A是B的地址,“*A”表示通过这个指向关系间接访问B.
如果B的值也是一个指针,它指向C,则B是C的地址,“*B”表示间接访问C,如果C是整型、实型或者结构体等类型的变量或者是存放这些类型的数据的数组元素,则B(即C的地址)是普通的指针,称为一级指针,用于存放一级指针的变量称为一级指针变量
A(即B的地址)是指向指针的指针,称为二级指针,用于存放二级指针的变量称为二级指针变量
 
如果A、B、C都是变量,即C是普通变量,B是一级指针变量,其中存放着C的地址,A是二级指针变量,其中存放着B的地址,则这3个变量分别在内存中占据各自的存储单元
以上内容来自百度百科
 
在学习数据结构链表一节中第一次遇到“二级指针”,代码如下:
typedef struct Node
{
DataType data;
struct Node *next;
}ListNode,*LinkList;

void InitList(LinkList *head)// head 是二级指针

{
if(((*head)=(LinkList)malloc(sizeof(ListNode)))==NULL)
exit(-1);
(*head)->next=NULL;
}
书上解释是 head是指向单链表的头结点的指针,用来接收主程序中待初始化单链表的头指针变量的地址, *head 相当于主程序中待初始化单链表的头指针变量。
读了几遍没能理解,百度一下得:

                                         C语言中不存在引用,所以当试图改变一个指针的值的时候必须使用二级指针。

                                         C++中可以使用引用类型来实现。

示范一个错误的例子,如果上面的初始化代码这样写:

void InitList(LinkList head)

{
if(((head)=(LinkList)malloc(sizeof(ListNode)))==NULL)
exit(-1);
(head)->next=NULL;
}
当此段代码执行完毕,主程序中头指针并没有处理,因为形参只是实参的一份“拷贝”,对形参的操作影响不到实参。
在正式解释上述InitList初始化代码时先看一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void memorylocate(char **ptr)
{
       *ptr=(char *)malloc(10*sizeof(char));
}
int main(int argc,char **argv)
{
         char *buffer;
         memorylocate(&buffer);
         strcpy(buffer,"12345");
         printf("buffer %s\n",buffer);
         return 0;
}

运行结果:buffer 12345

如果改为

void memorylocate(char *ptr)
{
        ptr=(char* )malloc(10*sizeof(char));
}
int main(int argc,char **argv)
{
         char *buffer;
         memorylocate(buffer);
         strcpy(buffer,"12345");
         printf("buffer %s\n",buffer);
         return 0;
}

strcpy执行不了···说明buffer未分配到存储空间···

这样一来,最初关于如何解释 为什么用二级指针 也就豁然开朗了。

 

对于链表的链式存储的初始化操作,遇到的有关“二级指针”的知识小结

标签:

原文地址:http://www.cnblogs.com/FightForCMU/p/4391662.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!