在学习C语言的时候,关于形参如何改变实参,链表中节点的值何时被改变,何时不被改变,一直没有搞明白,今天终于搞懂,记录下来备份。
1、形参改变实参
#include
<
stdio.h
>
#include
<
malloc.h
>
typedef
struct
LNode

...
{
FILE *fp;
char *fname;
struct LNode *next;
}
LNode;
LNode
*
LinkList;

LNode
*
ListInit(LNode
*
linklist)
...
{

if((linklist=(LNode *)malloc(sizeof(LNode)))==NULL)...{
printf("Init Link Error");
exit(0);
}
linklist->next=NULL;
return linklist;
}

ListInsert(LNode
*
linklist,
char
*
fname,FILE
*
fp)
...
{
LNode *lnode;
LNode *p;
p=linklist;

if((lnode=(LNode*)malloc(sizeof(LNode)))==NULL)...{
printf("Insert Error");
exit(0);
}

while(p->next!=NULL)...{
p=p->next;
if(!strcmp(p->fname,fname))

...{
p->fp=fp;
return ;
}
}
p->next=lnode;
lnode->fp=fp;
lnode->fname=fname;
lnode->next=NULL;
p=lnode;
//注意这一段代码,这里只是改变了test指针指向的所指变量的值,即fname的值,
//故,在main函数中的fname的值会发生变化

while(*fname!='
2、形参不改变实参
#include
<
stdio.h
>
#include
<
malloc.h
>
typedef
struct
LNode

...
{
FILE *fp;
char *fname;
struct LNode *next;
}
LNode;
LNode
*
LinkList;

LNode
*
ListInit(LNode
*
linklist)
...
{

if((linklist=(LNode *)malloc(sizeof(LNode)))==NULL)...{
printf("Init Link Error");
exit(0);
}
linklist->next=NULL;
return linklist;
}

ListInsert(LNode
*
linklist,
char
*
fname,FILE
*
fp)
...
{
LNode *lnode;
LNode *p;
p=linklist;

if((lnode=(LNode*)malloc(sizeof(LNode)))==NULL)...{
printf("Insert Error");
exit(0);
}

while(p->next!=NULL)...{
p=p->next;
if(!strcmp(p->fname,fname))

...{
p->fp=fp;
return ;
}
}
p->next=lnode;
lnode->fp=fp;
lnode->fname=fname;
lnode->next=NULL;
p=lnode;
//注意这一段代码,与前一个TestOne.c不一样,
//这里将fname的值变为"TTT"的地址,就是所fname的地址改变了,
//但是调用函数不能改变实参指针变量的值,也就是地址,故main函数中的fname的值不会变

/**//* while(*fname!='
3、通过改变main函数中的字符串数组的值,来改变链表中对应的值
#include
<
stdio.h
>
#include
<
malloc.h
>
typedef
struct
LNode

...
{
FILE *fp;
char *fname;
struct LNode *next;
}
LNode;
LNode
*
LinkList;

LNode
*
ListInit(LNode
*
linklist)
...
{

if((linklist=(LNode *)malloc(sizeof(LNode)))==NULL)...{
printf("Init Link Error");
exit(0);
}
linklist->next=NULL;
return linklist;
}

ListInsert(LNode
*
linklist,
char
*
fname,FILE
*
fp)
...
{
LNode *lnode;
LNode *p;
p=linklist;

if((lnode=(LNode*)malloc(sizeof(LNode)))==NULL)...{
printf("Insert Error");
exit(0);
}

while(p->next!=NULL)...{
p=p->next;
if(!strcmp(p->fname,fname))

...{
p->fp=fp;
return ;
}
}
p->next=lnode;
lnode->fp=fp;
lnode->fname=fname;
printf("...........after lnode->fname=%s ",lnode->fname);
lnode->next=NULL;
p=lnode;
LinkList = linklist;
}

FILE
*
openFile(
char
*
fname)
...
{
FILE *fp;
fp = fopen(fname,"w");
if(fp == (FILE *) NULL )

...{
puts("Cant open file");
exit(1);
}
return fp;
}

QueryList(LNode
*
link)
...
{
LNode *p;
p=link->next;

while(p!=NULL)...{
printf("data from QueryList fname = %s ",p->fname);
p=p->next;
}
}
int
main(
int
argc,
char
*
argv[])

...
{
int i;
FILE *fp;

char fname[10]=...{'A','A','A'};
//char *fname;
char *content;
LinkList = ListInit(LinkList);
fp = openFile("AAA.txt");
ListInsert(LinkList,fname,fp);
QueryList(LinkList);
//改变fname
strcpy(fname,"WWW");
printf("_______after change fname in Main___________ ");
QueryList(LinkList);
return 0;
}
4、改变main函数中字符串的值不影响链表
#include
<
stdio.h
>
#include
<
malloc.h
>
typedef
struct
LNode

...
{
FILE *fp;
//change here
char fname[10];
struct LNode *next;
}
LNode;
LNode
*
LinkList;

LNode
*
ListInit(LNode
*
linklist)
...
{

if((linklist=(LNode *)malloc(sizeof(LNode)))==NULL)...{
printf("Init Link Error");
exit(0);
}
linklist->next=NULL;
return linklist;
}

ListInsert(LNode
*
linklist,
char
*
fname,FILE
*
fp)
...
{
LNode *lnode;
LNode *p;
p=linklist;

if((lnode=(LNode*)malloc(sizeof(LNode)))==NULL)...{
printf("Insert Error");
exit(0);
}

while(p->next!=NULL)...{
p=p->next;
if(!strcmp(p->fname,fname))

...{
p->fp=fp;
return ;
}
}
p->next=lnode;
lnode->fp=fp;
//change here
strcpy(lnode->fname,fname);
//lnode->fname=fname;
printf("...........after lnode->fname=%s ",lnode->fname);
lnode->next=NULL;
p=lnode;
LinkList = linklist;
}

FILE
*
openFile(
char
*
fname)
...
{
FILE *fp;
fp = fopen(fname,"w");
if(fp == (FILE *) NULL )

...{
puts("Cant open file");
exit(1);
}
return fp;
}

QueryList(LNode
*
link)
...
{
LNode *p;
p=link->next;

while(p!=NULL)...{
printf("data from QueryList fname = %s ",p->fname);
p=p->next;
}
}
int
main(
int
argc,
char
*
argv[])

...
{
int i;
FILE *fp;

char fname[10]=...{'A','A','A'};
//char *fname;
char *content;
LinkList = ListInit(LinkList);
fp = openFile("AAA.txt");
ListInsert(LinkList,fname,fp);
QueryList(LinkList);
//改变fname
strcpy(fname,"WWW");
printf("_______after change fname in Main___________ ");
QueryList(LinkList);
return 0;
}