函数一

函数:“代码块"

每一个具体功能,都可以写成一个函数

C语言:以函数为主体

一、函数定义

1.语法格式:
//返回值类型 函数名(形参表)   //函数头
{
    //函数体
    
}    
2.解释:

返回值类型:反馈

函数名:合法标识符(一般是动词)

形参表:规定参数格式

函数体:代码

3.举例

函数代码及调用

#include<stdio.h>
#include<iostream>
using namespace std;

int add(int a, int b);

void func1();

//函数的声明
int main()
{
    int c=add(3,5);//作右值
    //返回了一个值,所以定义一个int c去接收这个值
    printf("c=%d\n",c);
    cout<<add(3,5)<<end;//直接打印
    
    func1();//独立语句
    return 0;
}

int add(int a, int b)  //因为是计算两个值的和
{						//所以肯定需要一个返回的答案
	//int c=a+b;		//也要int的类型
	//return c;			//和两个参数值,你自己填
	return a + b;
}

void func1()
{
    printf("fun1 was been used \n");

    

类型:

1.有类型,无参数

2.有类型,有参数

3.无类型,有参数

4.无类型,无参数

函数声明定义时小括号里的叫形参

函数调用时小括号里实际给的值,叫实参

二、函数声明

//返回值类型 函数名(形参表); //函数头

三、函数调用

1.语法

//函数名(实参表);

2.函数调用流程

1.从主函数进入被调用函数

主调函数:主函数

被调用函数:自己定义的

2.给形参分配临时内存,将实参的值拷贝给形参==》定义,声明阶段,形参没有内存
3.进入被调函数,执行函数体
4.系统自动回收临时内存
5.回到主调函数,有返回值的,带回返回值

3.用法

1.可以作为独立语句

2.如果有返回值,可以作右值,给变量赋值

3.可以直接用于打印

4.有返回值的,可以做实参

5.可以作为判断条件

#include<stdio.h>
#include<iostream>
using namespace std;

int add(int a, int b);

void func1();

//函数的声明
int main()
{
    //作右值
    int c=add(3,5);//返回了一个值,所以定义一个int c去接收这个值
    printf("c=%d\n",c);
    
    //直接打印
    cout<<add(3,5)<<end;
    
    //独立语句
    func1();
    //有返回值的,可以做实参
    cout<<add(1,add(3,5))<<endl;
    
    //可以作判断条件
    if(add(3,4) > 6)
    {
		printf("add(3,4)>6\n");
    }
    return 0;
}

int add(int a, int b)  //因为是计算两个值的和
{						//所以肯定需要一个返回的答案
	//int c=a+b;		//也要int的类型
	//return c;			//和两个参数值,你自己填
	return a + b;
}

void func1()
{
    printf("fun1 was been used \n");

    

4.参数传递

1.值传递

只能改变形参的值,不能改变实参的值
//写函数,交换两个数的值
	//值传递
void exchange1(int a1, int b1)
{
	printf("交换前a1=%d b1=%d\n", a1, b1);
	a1 = a1 ^ b1;
	b1 = a1 ^ b1;
	a1 = a1 ^ b1;
	printf("交换后a1=%d b1=%d\n", a1, b1);
}
int main()
{
    int m=10,n=20;
    exchange1(m,n);
    printf("m=%d n=%d\n",m,n);
}

2.址传递

可以改变实参的值

//址传递
void exchange3(int* a2, int* b2)
{
	printf("交换前a1=%d b1=%d\n", *a2, *b2);
	*a2 = *a2 ^ *b2;
	*b2 = *a2 ^ *b2;
	*a2 = *a2 ^ *b2;
	printf("交换后a1=%d b1=%d\n", *a2, *b2);
}
int main()
{
    int m = 10, n = 20;
	printf("交换前m=%d n=%d\n", m, n);
	//exchange3(&m, &n); 或者
    int *pm=&m,*pn=&n;
    exchange3(pm,pn);
    //也可以交换m和n的值
	printf("交换后m=%d n=%d\n", m, n);
    return 0;
}

3.引用传递

可以改变实参的值

//引用传递
//因为用的是引用,所以a2就是m,b2就是n
void exchange2(int& a2, int& b2)
{
	printf("交换前a1=%d b1=%d\n", a2, b2);
	a2 = a2 ^ b2;
	b2 = a2 ^ b2;
	a2 = a2 ^ b2;
	printf("交换后a1=%d b1=%d\n", a2, b2);
}
int main()
{
    int m=10,n=20;
    exchange2(m,n);
    printf("m=%d n=%d\n");
}

四、文件引用

include 系统文件

include"xxx" 自定义文件

box.h==>声明函数

box.cpp==>实现函数

main.cpp==>调用函数

五、函数与指针

1.指针函数

返回值是指针的叫指针函数

注意:使用指针函数,不能指向返回栈区变量的指针

int* function()
{
	int mn = 10;  //a:栈区变量
	int* p = &mn; //p:指针,指向栈区变量
	return p;   //1.返回p   2.释放a==>变成了野指针
}
int main()
{
	int* pa = function();
	printf("%d\n", *pa);
	printf("%d\n", *pa);
	return 0;
}

2.函数指针 函数本身有地址

指针本身的类型:指针指向的类型和*

指针指向的类型(函数本身的类型):

typedef int(*pp)(int int);

void func1()
{
    printf("func1 is used\n");
}
//对于这个函数
//他的类型是 void ()

//指向的类型: void(*)()

int func2(inta , int b)
{
    printf("func2 is used\n");
    return 0;
}

int main()
{
    void (*p)()=&func1;//函数指针
    (*p)();
    //效果和 func1一样
    
    //或者
    void (*p1)()=func1;
    p1();//效果一样
    (*p1)();//效果一样
    //可以取内容,也可以不取内容
    //类型符合的函数都可以指==》同样的类型
    
    int(*pp)(int int)=func2;
    pp(1,2);
    //或者
    //(*pp)(1,2);
    
    pp pfunc=func2;
    //调用
    pfunc(1,2);
    return 0;
}
宏定义===》完全替换
#define sum(n,m) n+m
int main()
{
    int x=sum(2,5)*sum(6,5);
    printf("%d",x);
    //答案是2+5*6+5=37
    return 0;
}
posted @ 2020-12-06 17:35  kisfly  阅读(74)  评论(0编辑  收藏  举报