链表,形参,实参

 在学习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;
}

你可能感兴趣的:(UNIX&LINUX)