在学习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!='
#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!='
#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;
}
#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;
}
#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;
}