在C语言中,函数的参数分为实参和形参,参数传递方式分为值传递和地址传递
先来说说值传递,这种传递方式是使用变量,常量,数组元素作为函数参数,实际上是将实参的值复制到形参相应的存储单元中,即实参和形参分别占用不同的存储单元,这种传递方式称为“参数的值传递”或者“函数的传值调用”。值传递的特点是单向传递,即主调函数调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并且维持数值不变。
#include<stdio.h>
void fun(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
printf("x=%d,y=%d\n",x,y);
}
int main()
{
int a=13,b=15;
fun(a,b);
printf("x=%d,y=%d\n",a,b);
}
这个是值传递的调用示例,结果是输出x=15,b=13,a=13,b=15。x,y是形参,形参的数值改变,而实参a,b的数值不会因为形参的改变而改变,就是因为形参和实参的存储单元不同。
地址传递:这种方式是使用数组名或者指针作为函数参数,传递的是该数组的首地址或者是指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。
地址传递的特点是形参并不存在存储空间,编译系统不为形参分配内存。数组名或指针就是一组连续空间的首地址,因此在数组名或指针作为函数参数是所进行的传送只是地址传送,形参在取得该首地址后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。
#include<stdio.h>
void fun(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
printf("x=%d,y=%d\n",*x,*y);
}
int main()
{
int a=13,b=15;
fun(&a,&b);
printf("x=%d,y=%d\n",a,b);
}
这个运行结果就是x=15,y=13,a=15,b=13。因为实参和形参拥有相同的存储单元。
这个在当时学习c语言的时候还不懂为什么是这样,现在回顾c的知识之后才深刻了解了参数传递的含义。
下面是结构体,结构体的大致含义我是知道的,但是在运用方面还是不太熟练,就再复习复习。
结构体的格式:
struct 结构体名
{
数据类型表示符 结构体成员名;
}
结构体变量的定义:结构体变量同其他变量一样也必须先定义后使用,结构体变量定义要按照结构体说明中的结构体类型,为被定义的结构体变量分配内存单元,而结构体说明不分配内存。
结构体成员的引用:用结构体成员运算符“.”引用结构体成员格式,若定义了指向结构体的指针变量,也可以用->来引用成员。如:
struct student
{
char name[20];
int age;
char xh;
int score;
}
如果定义结构体变量:struct student stu1; struct student *stu2; stu2=&stu1;则stu1.name,(*stu2).name,stu2->name这三种引用成员的方式等价。
还有一个要注意的问题就是结构体变量的初始化,结构体变量只可整体初始化,不可整体赋值,也不能直接在结构体成员中对成员赋初值,但结构体变量间可以相互赋值。
还有typedef这个保留字,用typedef定义数据类型就是给已存在的数据类型重新命名一个新名字。
例如:
typedef struct student
{
char name[20];
int age;
}stu;
在定义结构体变量的时候就可以 stu stu1; stu *stu2;