使用指针,就是为了能够修改指针所指向的东西,为了能够修改‘指针本身’,就需要传递指针的指针。
比如:一、为了改变char a的值,在调用函数时,你的函数就是modify(char *p);
二、为了改变char *p,中p的值,在调用函数时,你的函数就是modify(char **p);
这就是为什么在数据结构中常用指针的指针来创建根结点。
typedef struct node{
struct node *next;
int num;
}node;
如有这个结构,用于创建链表,创建表头有两种方式,一种是通过,函数返回链表头的地址;另一种是通过参数传递,改变原变量的内容(原变量是个地址)。
2.参数传递改变地址;
如果为node *head=NULL,这种形式,然后把head以某种形式作为参数,使得返回返回后head指向链表头节点。
void Create_head_v0(node **p)
{
if(p==NULL)
return;
*p=(node *)malloc(sizeof(node));
(*p)->next=NULL;//注意要括号。
(*p)->num=1;
}
void main()
{
node *head=NULL;
printf("head的地址为:%x\n",&head);
printf("之前head存储的地址为:%x\n",head);
Create_head_v0(&head);
printf("之后head的地址为:%x\n",&head);
printf("之后head存储的地址为:%x\n",head);
printf("num=%d\n",head->num);
3.返回地址
返回地址相当于是直接赋值。
node *head=NULL;
head=newadd.
node *Create_head_v1()
{
node *head= (node *)malloc(sizeof(node));
head->next=NULL;//注意要括号。
head->num=2;return head;
}
转载请标明出处:<a target=_blank href="http://blog.csdn.net/lin200753/article/details/29582075">http://blog.csdn.net/lin200753/article/details/29582075</a>
void main()
{
node *head=NULL;
head=Create_head_v1();//这里通过赋值的方式改变head的内容。
printf("num=%d\n",head->num);
4.按从大到小向链表中插入数据
由于可能改变表头head的内容,所以也用指针的指针。
//从大到小;
int inser3(node **nod,int val)
{
node *newnoid=(node*)malloc(sizeof(node));
if(newnoid==NULL)
return -1;
newnoid->num=val;
newnoid->next=NULL;
while ((*nod) != NULL) {
if (val > (*nod)->num)
break;
nod = &((*nod)->next);
}
newnoid->next = *nod;
*nod=newnoid;
return 0;
}
/*从头到尾释放*/
void Free_node(node *head)
{
node *pre=NULL,*cur=head;
while(cur!=NULL)
{
pre=cur;
cur=cur->next;
printf("释放node->num=%d\n",pre->num);
free(pre);
}
}
void main()
{
node *head=NULL;
node *root=NULL;
inser3(&root,5);
inser3(&root,1);
inser3(&root,3);
inser3(&root,2);
inser3(&root,1);
head=root;
while(root!=NULL)
{
printf("%d\n",root->num);
root=root->next;//此时root不指向根。
}
Free_node(head);
}