C语言 void ds_init(node **pNode)形参为两个星号是什么意思呀,

#include <stdio.h>
#include <stdlib.h>
typedef struct CLinkList
{
int data;
struct CLinkList *next;
}node;
void ds_init(node **pNode) //这两星号是什么意思呀?指向指针的指针?
{
int item;
struct CLinkList *temp;
struct CLinkList *target;
printf("输入结点的值,输入0完成初始化\n");
while(1)
{
scanf("%d", &item);
fflush(stdin);
if(item == 0)
return;
if((*pNode) == NULL)
{ /*循环链表中只有一个结点*/
*pNode = (node*)malloc(sizeof(struct CLinkList));
if(!(*pNode))
exit(0);
(*pNode)->data = item;
(*pNode)->next = *pNode;
}
else
{
/*找到next指向第一个结点的结点*/
for(target = (*pNode); target->next != (*pNode); target = target->next)
;
/*生成一个新的结点*/
temp = (node *)malloc(sizeof(struct CLinkList));
if(!temp)
exit(0);
temp->data = item;
temp->next = *pNode;
target->next = temp;
}
}
}

int main()
{
node *pHead = NULL;
char opp;
int find;
printf("1.初始化链表 \n\n2.插入结点 \n\n3.删除结点 \n\n4.返回结点位置 \n\n5.遍历链表 \n\n0.退出 \n\n请选择你的操作:");
while(opp != '0')
{
scanf("%c", &opp);
switch(opp)
{
case '1':
ds_init(&pHead);
printf("\n");
ds_traverse(pHead);
break;
case '2':
printf("输入需要插入结点的位置?");
scanf("%d", &find);
ds_insert(&pHead, find);
printf("在位置%d插入值后:\n", find);
ds_traverse(pHead);
printf("\n");
break;
}
}
return 0;
}

两个“*”号的指针变量,表示指针的指针,问题中的pNode指向的对象还是一个指针。下图是一个示例:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-05
两个星号叫做“二级指针”,意思就是指向指针的指针。
如果是一级指针,node *Pr,那么Pr是指向一个node结构,而node **Pr2,那么Pr2指向一个指针,而那个指针又指向一个node结构。追问

前辈能不能讲细点呀,看了后觉得有点懂了,又发现懂得不多,,,

追答

我在这里怎么说,也不能说清楚,要弄明白就买本书,仔细的把来龙去脉搞清楚。指针是C语言的精华,是最难,也是最有魅力的地方。所有的变量、数组和函数,都可以使用指针来完成,奇妙无穷。在这里讨论一两句,是不可能把C语言的指针搞明白的。

追问

那应该买什么书呢?

追答

当当或是京东上一搜一大堆。要看你打算学到什么程度,这个要看个人造诣,不是一两天就能学通的。舍得花钱买本好书,慢慢钻研吧。

追问

那他用二级指针有什么用呢?通常不都用一个星的指针吗?

追答

不不不,因为你现在学的还不够深入,所以可能见到的大部分都是一级指针,事实上二级指针非常的常见,比如在操作系统移植的时候,经常使用。只不过你现在见得少。慢慢学吧。

本回答被提问者和网友采纳
第2个回答  2013-10-05
*是指针,**是指向指针的指针,而指针就是地址,一个*是指向一个变量的地址,而 ** 则是指向 * 的地址,存放的是 * 的地址