C语言-函数-1
以下是我初学C语言的笔记记录,欢迎在评论区留言补充
一,函数分为几类
* 函数分为两类:
一类是库函数;一类是自定义函数
* 库函数:
系统自己带的,在使用时候,要用到头文件;
查询库函数工具:
cppreference.com
* 自定义函数:
(1)需要包括类型,函数名,主体(表示式);
(2)如果要是自定义这个函数不需要返回值,就定义" void " 类型
图一
# include <stdio.h>void S(int a) // 类型 函数名(形参) {printf("用的是void,不用返回值"); } //主体(表达式) int main() {int a = 1;S(a); //调用自定义函数return 0; }
图二
//不是void,这里用的是int #include<stdio.h> int Add(int x, int y) //返回值类型为整数,函数名(形参) {int z = 0;z = x + y;return z; } //主体(表达式) int main() {int a = 0;int b = 0;int c = 0;scanf("%d %d", &a, &b);c = Add(a, b); //调用自定义函数printf("c等于%d", c);return 0; }
二,函数的参数
* 分类:
实参和形参
* 实参:
(1)比如图二main函数中【c = Add(a,b)】内的a,b;
(2)实参是main函数中调用自定义函数中的参数,可以是常量,变量或是表达式【c = Add(a+3,b)】,函数【c = Add(Add(3,5),b)】;
(3)实参是要有一个真实且准确的结果传给形参即可;
(4)实参的作用域或是生命周长:我个人的理解是main函数什么时候结果,它的生命或是作用域也就结束了
* 形参:
(1)比如图二自定义函数中【Add(int x, int y)】内的 x ,y;
(2)形参是在自定义括号内,当main中调用后,就会被销毁,即只有在函数中形参有效;在函数调用的时候,才会被分配内存单元;
(3)形参的作用域或是生命周长:当main函数调用自定义函数开始,到自定义函数完成了所有表达式,就会被销毁
举例:
大概可以理解为黄色部分为实参的作用域,它跟随着main函数;绿色部分为形参的作用域,它开始的条件是黄色部分要调用自定义函数
* 实参和形参的联系
其实两者的关系,和调用方式有着很大联系;
其次,形参实例化【实例化,就是给参数分配内存单元了】是实参的一份临时拷贝,通常情况下,修改形参的数值是无法改变到实参的身上,但是也有例外,比如当进行传址调用时
三,函数的调用
* 调用方式:
一种是传值调用,一种是传址调用
* 传值调用:
把实参的值复制给形参,自定义函数内对形参的修改不影响实参
* 传址调用:
将实参地址传给形参,自定义函数对形参的修改会影响到实参
【我个人对两种调用的理解,前者:实参的值复制给形参的时候,形参开始被创建,意味着它也有内存单元了,即它有了存放这个值的地址了,但是实参和形参的地址是相互独立的,即使两者存放的值是一样的,但是彼此位置唯一且不同,所以形参的修改不影响实参;后者:因为实参是将自己的地址传给了形参,即形参此时是一个指针变量,用来存放地址,那么如果想要形参的修改影响到实参,那么在自定义函数中的表达式,要用到解引用操作符,这样相当于是地址唯一,通过定位进行修改,就可以改变实参值,此时的修改就起到了作用】
形参的指针变量存着是实参的地址
//效果:将a,b两个值互换# include<stdio.h> void Xf(int* x, int* y)//用指针变量存放a,b的地址 {int z = 0; //作用是临时存放其中一个变量z = *x;//解引用操作符,此时*x就是a*x = *y;//这句话意思是 a = b,b赋值给a*y = z; // b = z,z赋值给b//注意在这个表达式中,如果没有解引用操作符,//将形参中的地址翻译成对应的变量,那么无法成功互换数值 } int main() {int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("换位置前a=%d,b=%d", a, b);Xf(&a, &b);//取a,b的地址printf("\n换位置后a=%d,b=%d", a, b);return 0; }
【琐碎记录】
一个工程里,可以有多个.c,但是只能有一个main函数