【C语言基础】:深入学习C语言的函数

发布时间:2024年01月21日

📑文章目录:

目录

? ? 一.?📑函数:

? 1.1:🔥C语言函数优势? ? ? ? ? ??

1.2:🔥自定义函数的语法形式

1.3:📑返回值

? ? ? 1.3.1🔥没有返回值的示例:

? ? ? ?1.3.2🔥有返回值的示例:

1.4:📑函数调用的不同方面

1.4.1🔥不带参数和返回值的函数示例

?1.4.2🔥没有参数但有返回值的函数? ? ? ? ? ? ? ?

1.4.3🔥带参数且不带返回值的函数示例

1.4.4🔥带参数和返回值的函数示例:

1.5. 函数的参数??

1.6.return 语句

?1.7.函数参数传递常用的三种方式

? ? ? ? 1.6.1:值传递

? ? ? 1.6.2:指针传递

? ? ? ? 1.6.3:引用传递(简单了解)


? ? 一.?📑函数:

? ? 函数是执行特定任务的代码块。

? ? 假设您需要创建程序来创建一个圆并为其着色。您可以创建两个函数来解决此问题:

  • ? ??创建一个圆的函数

  • ? ?? 创建颜色的函数

? ? ?将复杂的问题分成较小的块可以使我们的程序易于理解和重用。

? 1.1:🔥C语言函数优势? ? ? ? ? ??

C函数具有以下优点。

  • 通过使用函数,我们可以避免在程序中一次又一次地重写相同的逻辑/代码。

  • 我们可以在程序中以及在程序的任何位置多次调用C函数。

  • 当大型C程序被划分为多个函数时,我们可以轻松地对其进行跟踪。

  • 可重用性是C函数的主要成就。

  • 但是,函数调用始终是C程序的开销。

1.2:🔥自定义函数的语法形式

? ? ? 自定义函数和库函数一样,有函数名返回值类型函数参数。
? ? ? 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间

? ? ? ?函数的组成:? ?

ret_type fun_name(para1, * )
{
 statement;//函数体
}
ret_type 返回类型
fun_name 函数名
para1 ? ?函数参数

ret_type:?是用来表示函数计算结果的类型,函数可能会也可能不会有从该函数返回值。如果您不必从函数返回任何值,则将void用作返回类型,表示什么都不返回。

fun_name:是为了方便使用函数;就像人的名字一样,有了名字方便称呼,函数有了名字方便调用,所以函数名尽量根据函数的功能起有意义的名字。

函数的参数就相当于工厂送进去的原材料,函数的参数也可以是void,明确表示函数没有参数,如果有参数,要交代清楚函数的类型和名字,以及参数的个数。

? ? ? ? ??

1.3:📑返回值

? ? ? 1.3.1🔥没有返回值的示例:

void print()
{
   printf("hello world");
}

? ? ? ?1.3.2🔥有返回值的示例:

如果要从函数返回任何值,则需要使用任何数据类型,例如int,long,char等。返回类型取决于要从函数返回的值。

让我们看一个简单的C函数示例,该函数从该函数返回int值。

int get()
{
   return 10;
}

在上面的示例中,我们必须返回10作为值,因此返回类型为int。如果要返回浮点值(例如10.2、3.1、54.5等),则需要使用float作为方法的返回类型。

示例:

float get()
{
    return 10.2;
}

1.4:📑函数调用的不同方面

函数可以接受也可以不接受任何参数。它可能会或可能不会返回任何值。基于这些事实,函数调用有四个不同方面。

  • 没有参数且没有返回值的函数

  • 没有参数但有返回值的函数

  • 有参数且无返回值的函数

  • 带有参数和返回值的函数

1.4.1🔥不带参数和返回值的函数示例

? ? ? ? ? ? ? ? ?

实例1
void print(void)//不写void的话,调用时可以传参也可以不传
{
    printf("hehe\n");
}

int main()
{
    print();
    printf(1)//没有void的话,这句话也可以打印hehe,有void的话,语法错误
    return 0;
}

实例2
void sum()
{
    int a, b;
    printf("\n输入两个数字\n");
    scanf("%d,%d", &a, &b);
    printf("总和是 %d", a + b);
}
void main()
{
    printf("\n计算两个数字和");
    sum();
}

?1.4.2🔥没有参数但有返回值的函数? ? ? ? ? ? ? ?

int sum()
{
    int a,b; 
    printf("\n输入两个数字");
    scanf("%d %d",&a,&b);
    return a+b; 
}

void main()
{
    int result; 
    printf("\n计算两个数的和:");
    result = sum();
    printf("%d",result);
}

1.4.3🔥带参数且不带返回值的函数示例

实例1:
void sum(int a, int b)
{
	printf("\n总和是 %d",a+b);    
}

void main()
{
    int a,b; 
    printf("\n计算两个数的和:");
    printf("\n输入两个数字:");
    scanf("%d %d",&a,&b);
    sum(a,b);
}
实例2:
void average(int a, int b, int c, int d, int e)
{
	float avg; 
	avg = (a+b+c+d+e)/5; 
	printf("给定五个数字的平均值 : %f",avg);
}
void main()
{
    int a,b,c,d,e; 
    printf("\n要计算五个数的平均值:");
    printf("\n输入五个数字:");
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
    average(a,b,c,d,e);
}

1.4.4🔥带参数和返回值的函数示例:

实例1:
int sum(int a, int b)
{
	return a+b;
}

void main()
{
    int a,b,result; 
    printf("\n计算两个数的和:");
    printf("\n输入两个数字:");
    scanf("%d %d",&a,&b);
    result = sum(a,b);
    printf("\n总和是 : %d",result);
}
实例2:检查数字是偶数还是奇数的程序
int even_odd(int n)
{
	if(n%2 == 0)
	{
		return 1;
	}
	else 
	{
		return 0;
	}
}
void main()
{
 int n,flag=0;
 printf("\n检查一个数字是偶数还是奇数");
 printf("\n输入数字: ");
 scanf("%d",&n);
 flag = even_odd(n);
 if(flag == 0)
 {
 	printf("\n数字是奇数");
 }
 else 
 {
 	printf("\n这个数是偶数");
 }
}

1.5. 函数的参数??

实际参数(实参):
? ? ? ? ? ?真实传给函数的参数,叫实参。
? ? ? ? ? ? 实参可以是:常量、变量、表达式、函数等。
? ? ? ? ? ? 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
? ? ? ? ? ? ?形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化? ? ? ? ? ? (分配内 存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此? ? ? 形式参数只在函数 中有效
F11进入函数内部
注意:实参和形参在函数内部的地址是不一样的,所以系统给它们分配的空间不一样。
? ? ? ? ? ?1.形参和实参是完全不同的内存空间
? ? ? ? ? ? 2.形参是实参的临时拷贝(后面讲的值传递)
? ? ? ? ? ? 3.形参的修改不会改变实参

1.6.return 语句

1.return后面可以是一个数值,也可以是一个表达式,如果是表达式,优先执行表达式,

2.return后面也可以什么都没有,直接写return,这种写法适合函数返回类型是void的情况

3.return返回的值和函数返回的类型不一致,系统会自动将返回的值隐式转换为函数的返回类型。

4.return语句执行后,函数就彻底返回,后边的代码不在执行

5.如果函数中存在if等分支语句,则要保证每种情况都有return返回,否则会出现编译错误

?1.7.函数参数传递常用的三种方式

? ? ? ? 1.6.1:值传递

void swap(int x, int y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main( int argc, char *argv[] )
{
    int a = 5;
    int b = 10;
    swap(a, b); //调用交换函数
    printf("交换结果为 a = %d, b = %d\n",a,b);
    return 0;
}

由于值传递是单向传递,传递过程中只是改变了形参的数值,并未改变实参的数值,因此并不会改变a和b原有的值。

? ? ? 1.6.2:指针传递

void swap(int *x, int *y)
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

int main( int argc, char *argv[] )
{
    int a = 5;
    int b = 10;
    swap(&a, &b); //调用交换函数
    printf("交换结果为 a = %d, b = %d\n",a,b);
    return 0;
}

指针传递过程中,将a和b的地址分别传递给了x和y,在函数体内部改变了a、b所在地址的值,即交换了a、b的数值。

? ? ? ? 1.6.3:引用传递(简单了解)

void swap(int &x, int &y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

int main( int argc, char *argv[] )
{
    int a = 5;
    int b = 10;
    swap(a, b); //调用交换函数
    printf("交换结果为 a = %d, b = %d\n",a,b);
    return 0;
}

引用传递中,在调用swap(a, b);时函数会用a、b分别代替x、y,即x、y分别引用了a、b变量,这样函数体中实际参与运算的其实就是实参a、b本身,因此也能达到交换数值的目的。

注:严格来说,C语言中是没有引用传递,这是C++中语言特性,因此在.c文件中使用引用传递会导致程序编译出错。

文章来源:https://blog.csdn.net/weixin_64484421/article/details/135679741
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。