本文主要是介绍一级指针域二级指针的函数参数传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
预备知识:
函数参数的传递问题(一级指针和二级指针)
原以为自己对指针掌握了,却还是对这个问题不太明白。请教!
程序1:
void myMalloc(char *s) //我想在函数中分配内存,再返回
{
s=(char *) malloc(100);
}
void main()
{
char *p=NULL;
myMalloc(p); //这里的p实际还是NULL,p的值没有改变,为什么?
if(p) free(p);
}
程序2:void myMalloc(char **s)
{
*s=(char *) malloc(100);
}
void main()
{
char *p=NULL;
myMalloc(&p); //这里的p可以得到正确的值了
if(p) free(p);
}
1.被分配内存的是行参s,p没有分配内存
2.被分配内存的是行参s指向的指针p,所以分配了内存
遇到的问题:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <TIME.H>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *next;
}Node;//Node为结构体类型.
typedef struct Node * LinkList;//声明LinkList为struct Node指针类型,即为struct Node *.
/*初始化单链表*/
/********************************************************
* 函数名:int InitList(LinkList *L)
* 函数功能: 初始化单链表
* 输入参数:LinkList *L
* 输出参数:int
* 作者:YL
* 当前版本:v_1
* 完成日期:2014-03-10
/********************************************************/
int InitList(LinkList *L)//LinkList *L 即L为指向LinkList类型指针的指针变量,struct Node **.
{
*L=(LinkList )malloc(sizeof(Node));//产生头结点,并使*L指向此头结点.
if(!(*L))//若分配内存失败,malloc会返回NULL
return -1;
(*L)->next=NULL;
return 0;
}
下面是对上面函数调用时出现的问题:
错误的调用:
void main()
{
LinkList *B;
int i;
i=InitList(B);
//printf("%d ",i);
//printf("%d ",B->next);
}
错误的原因:在定义LinkList *B;此为struct node ** B,后再调用函数时,值传递,即B的值传递给L,而B为指向指针的指针,B内的地址所指的值是不确定的,所以当
调用时,访问的不该访问的内存,程序会出错。
正确使用:
void main()
{
LinkList B;
int i;
i=InitList(&B);
//printf("%d ",i);
//printf("%d ",B->next);
}
这篇关于一级指针域二级指针的函数参数传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!