学过c语言的都知道c语言的swap函数交换操作,那也是最早的有关函数形参和实参的介绍,以及指针的引入。
#include<stdio.h>
void swap(int a,int b)
{
printf("a的内存%p,a的地址是%p\nb的内存%p,b的地址是%p\n",a,&a,b,&b);
}
int main()
{
int *pa,*pb;
int a=3,b=35;
pa=&a;
pb=&b;
printf("a的内存%p,a的地址是%p\nb的内存%p,b的地址是%p\n",*pa,pa,*pb,pb);
swap(a,b);
}
通过结果,可以得到结论:函数传递参数过程中,若没使用指针进行传递,则系统会为保护数据自动生成所传递的参数的副本,对副本进行操作,若使用指针,则不会创建副本。
那么,如何修改指针变量的指向尼,(当然满足上述原则)
#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
int data;
struct node *next;
};
void Connect(List L);
void Connect(List L)
{
L->data=15;
}
int main()
{
List L=(List)malloc(sizeof(struct node));
L->data=10;
L->next=NULL;
Connect(L);
printf("%d",L->data);
}
因为L副本与L数据相同,所以指向也会相同。因此可以直接修改data的值。
而下面这段代码就会出现一定问题了。
#include<stdio.h>
#include<stdlib.h>
typedef struct node *List;
struct node
{
int data;
struct node *next;
};
void Connect(List L);
void Connect(List L)
{
List T=(List)malloc(sizeof(struct node));
T->data=15;
L=T;
}
int main()
{
List L=(List)malloc(sizeof(struct node));
L->data=10;
L->next=NULL;
Connect(L);
printf("%d",L->data);
}
这里直接将L指向T所指向的,以为结果L->data=15,其实不然,你修改的只是L(副本)的指向,与L本身无关,所以需要引入指针的指针方可操作。
void Connect(List *L)
{
List T=(List)malloc(sizeof(struct node));
T->data=15;
*L=T;
}
int main()
{
List L=(List)malloc(sizeof(struct node));
L->data=10;
L->next=NULL;
Connect(&L);
printf("%d",L->data);
}
这样修改后,则程序不会默认给你创建副本,因此在数据结构链表有关内容时,大多采用指针的指针来传递参数。
以上只是本人个人见解,如果有错误的点,希望有人指出。
(虽然可能没人看,HHHHH)。