初始化一个线性表的实质和销毁一个线性表的实质

1、初始化一个二元组数据类型(线性表类似)的实质是给已知的指针进行初始化,这个指针即是头指针。

将这个指针指向一个定长的数组

#define NUM 2
typedef int List;
List *head;

bool initList(List* &list)//此处是必须是指针的引用&,否则就是将未初始化的变量代入到函数中
{
    if( !(list = (List*)malloc(NUM*sizeof(List))))//此处必须要进行判断,因为如果没有new成功,
      exit -1;                                    //下面的代码list[0]就会出现错误。
    list[0]= 1;
    list[1]= 2;
    return true;
}

 解释下为何参数必须是引用类型?形如下例子、

int nn;
bool func1(int mm)
{
   mm = 1;
   return true;
}

func1(nn);//值传递的形式,是将实参nn的值复制给了形参mm,
//对nn本身没有影响,因为nn并没有进行初始化,传递给mm的值也是不可知数,同时输出nn的值,是个不可知数。

所以,第一个例子中,变量head并没有进行初始化,倘若func函数形参只是传递值本身,那么对于指针head来说也并没有什么影响,head仍然没有被初始化,此时输出head[0]也是未知数。

但是func函数中传递的是引用的话,则是将指针head本身给拿进来了,而不是复制其值。

小结:指针变量与普通变量想通点,变量在=的左边时,改变量被初始化或被重新赋值,其值发生了改变。只不过是指针有两种初始化的方式:

静态初始化:int a =1;  int *p = &a;

动态初始化:int *p= (int*)malloc(sizeof(int));

以上两种情况,指针变量p均在赋值表达式的左边,其值都要改变。

指针的值是一个地址,是一个十六进制数。形如:  0x5de170

总结:函数进行值传递,首先实参得先有值,即已经进行了初始化。

2、销毁一个二元组数据类型(线性表类似)的实质是将给程序动态分配的内存空间操作权还给系统,释放内存。

1)函数参数为非引用的话,虽然malloc的内存空间也能被释放,但是,head指针无法被赋值为NULL,而仅仅是函数中的指针list被赋值为NULL了。

2)函数参数为引用,free的时候不仅可以将内存释放,同时可以将指针进行赋值NULL

总结:销毁函数的形参是引用更完美。

虽然如果是非引用的话,也能释放malloc申请的内存空间,但无法对实参进行赋值NULL操作。 

发布了25 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/modi000/article/details/104201904