在学习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)
分享到:
相关推荐
如果形参需要间接访问实参指针所指向的对象且有存储空间,应选择指针参数(A)。若只需拷贝实参值,与实参无关,应选择值参数(C)。 7-8. 时间复杂度分析:时间复杂度是衡量算法效率的重要指标。第7题的程序时间...
4. 函数调用与形参实参:形参是在函数定义时声明的,只在函数内部有效,调用结束后释放。实参是在调用函数时传递的值,可以是常量、变量、表达式等。形参和实参之间的数据传递是单向的,形参的变化不会影响实参。 5...
1. 指针参数传递:传递的是地址值,形参是实参副本,对形参的修改不会影响实参。 2. 引用参数传递:形参存储实参的地址,对形参的操作直接影响实参。 3. 区别在于,引用参数的修改是直接作用于实参,而指针参数的...
2. 参数传递:可以使用形参和实参来传递函数参数。例如,在函数fun中,使用STREC *a和int *n作为形参,传递结构体数组和整型变量。 3. 返回值:可以使用return语句返回函数的执行结果。例如,在函数fun中,使用...
本试题库主要涵盖了数据结构的基础知识,包括算法的评价标准、链表操作、线性表的特性、栈和队列的操作、图的类型、散列表的冲突处理、形参和实参的关系、稀疏矩阵的存储以及排序和二叉搜索树的时间复杂度。...
而在地址传递中,形参和实参共享同一内存,形参的修改会影响实参。 3. 形参和实参的值传递问题: - 值传递:函数调用时,实参的值被复制到形参中,两者在内存中是独立的。如`swap()`函数中的例子,形参`x`和`y`的...
由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。 2、注意传递的实参需要取地址 3、循环链表的优势在于双链表合并,以及...
7. 形参与实参:如果需要形参直接访问实参,应使用引用参数,这样形参就是实参的一个别名,修改形参即修改实参。 8. 稀疏矩阵:在带行指针向量的存储方式中,每个单链表的结点具有相同的行号,因为它们属于同一行。...
12. 形参与实参的关联:问题14中,如果形参需要直接访问实参,应声明为引用参数,这样形参就是实参的别名。 13. 时间复杂度分析:问题15和16中,双层循环的执行时间复杂度为O(m*n),而递归函数的时间复杂度为O(n)。...
文档中的内容涉及到了计算机科学和编程的多个知识点,主要包括IP地址与子网掩码的运算、数据类型在内存中的表示、C语言中的算术运算、指针与引用、函数调用时的实参与形参关系、数据结构(如树)的理解、算法(如...
7. 形参与实参:若需要形参直接访问实参,形参应声明为引用参数,这样它们会直接绑定到实参,而不是复制实参的值。 8. 稀疏矩阵的链接存储:在带行指针的向量链接存储中,每个单链表代表一行,其节点具有相同的行号...
7. **形参与实参**:若需要形参直接访问实参,应使用引用参数(D),这样形参是实参的别名,修改形参会直接影响实参。 8. **稀疏矩阵**:在稀疏矩阵的带行指针向量的存储中,每个单链表中的结点都有相同的行号(A)...
- **形参与实参的关系**:函数调用时,实参的值传递给形参,但形参的修改不会影响实参,除非形参是实参的指针,如`void fun(int *a)`。 在给定的题目中,通过解析可以看出,正确理解和使用指针是解决问题的关键。...
7. **形参与实参**:如果需要形参直接访问实参,应该使用指针参数,这样形参可以指向实参的内存地址。 8. **稀疏矩阵**:在稀疏矩阵的链接存储中,每个单链表中的节点都具有相同的行号,因为它们属于同一行的非零...
7. 形参与实参:如果需要形参直接访问实参,应使用指针参数,因为它们可以修改实参的值。 8. 稀疏矩阵存储:在带行指针向量的链接存储中,每个单链表中的节点都有相同的行号,因为它们属于同一行的非零元素。 9. ...
9. **函数调用方式**:引用调用(call by reference)中,形参是实参的别名,修改形参会影响实参的值。值调用(call by value)则创建实参的副本,修改形参不会影响实参。根据题目描述,引用调用时,形参x被修改,...
而地址传递则是通过传递实参的地址给形参,形参和实参指向同一个内存空间,因此函数对形参的修改会影响到实参。在`change2`函数中,`*p`和`*q`的改变直接影响到了`a`和`b`的值。 2. **函数结果返回**: C语言中,...
1. **形参与实参**:形参(形式参数)是在函数定义时使用的参数,而实参(实际参数)是在函数调用时传递给函数的值。如果需要形参直接访问实参,应该使用**引用参数**(B选项),因为引用参数是实参的别名,修改引用...
1. **形参与实参**:在编程中,形参是函数声明中的参数,而实参是在调用函数时传递的值。如果需要形参直接访问实参,应该使用引用(B. 引用)作为形参类型,因为引用本质上是变量的别名,它不会复制数据,而是直接...
- **指针参数**:如果需要形参直接访问实参,应使用指针参数,形参是实参地址的副本。 8. **非线性结构**: - 非线性结构包括树型结构和图型结构,题目中的队列、栈和线性表是线性结构,而二叉树是非线性结构。 ...