目录
前言
C语言函数是C语言程序中的基本构建模块,用于实现特定的功能。在C语言中,函数包含了一系列的语句,用于完成特定的任务。通过函数,可以将程序分解为更小的模块,提高代码的可读性和可维护性。函数通常包括函数名、参数列表、返回类型、函数体等组成部分,通过函数名和参数列表来调用函数并执行其中的代码逻辑。
一、重构基本思想
重构是一种通过重新组织现有代码结构,以改进代码质量、可读性和可维护性的过程。其基本思想是通过一系列小的、可控制的步骤,把代码重构到更好的设计和结构,而不改变代码的外部行为。重构的目的是使代码更易理解、更容易扩展和更新,并且更容易测试。

二、函数的意义
对流程结构的封装,在C语言中,函数是一种封装了一组任务或操作的代码块。函数可以帮助组织代码,提高代码的复用性和可维护性。
代码示例
#include <stdio.h>
void 判断结婚(int sex, int age);//声明状态
int main()
{
/*函数的意义:对流程结构的封装*/
int age = 21;
int sex = 0;//在C语言中 非0的数字(比如1)代表逻辑‘真’ 0代表逻辑‘假’
//此例中:1 代表男 0 代表女
判断结婚(sex, age);//调用状态
return 0;
}
void 判断结婚(int sex, int age)//定义状态
{
if (sex)
{
if (age >= 22)
{
printf("男的 能\n");
}
else
{
printf("男的 不能\n");
}
}
else
{
if (age >= 20)
{
printf("女的 能\n");
}
else
{
printf("女的 不能\n");
}
}
}
三、函数结构与状态

四、函数之间的数据传递

#include <stdio.h>
//函数的声明状态
int add(int a, int b);
int main()
{
/*函数的前置声明*/
/*函数的执行原理:调用时执行,执行完消失*/
int he = add(8, 9);
printf("%d\n",he);
printf("%d %d\n",add(10,20),add(109,110));
/*函数的数据(值)传递为:copy(复制)方式 */
/*自定义头文件*/
return 0;
}
//函数:定义状态
int add(int a,int b)
{
int sum=0;
sum=a+b;
return sum;
}
int add_all(int a[] )
{
int sum=0;
int len=sizeof(a)/sizeof(a[0]);
int i;
for(i=0;i<len;i++)
{
sum+=a[i];
}
return sum;
}
void exchange(int a,int b)
{
return;
}
void swap(int*p,int *q)
{
}
五、函数的执行原理
函数的执行原理可以看作是一种逐层调用和返回的过程,通过栈的方式保存和管理函数的执行状态和数据。




六、调用栈(stack)
在C语言中,调用栈是用来跟踪程序执行期间函数调用的一种数据结构。每当一个函数被调用时,将会在调用栈中分配一段新的内存空间,用来存储该函数的局部变量、参数值、返回地址等信息。
调用栈是一个先进后出(FILO)的数据结构,也就是最后调用的函数会最先执行完毕并将其对应的内存空间释放。当一个函数调用另一个函数时,会将调用者函数的返回地址和一些其他相关信息压入调用栈中,然后开始执行被调用的函数。

七、入坑
使用数组作为形参
仅使用数组作为形参得到的只是一个首地址,需要另外定义一个长度(推荐的手段)


使用数组指针作为形参:
数组指针指向的是一组数,但是其数组类型中的长度是固定的不灵活
#include <stdio.h>
//函数的声明状态
int add(int a, int b);
int add_all(int a[],int len);
int add_all_2(int (*a)[10]);
int main()
{
/*函数的前置声明*/
/*函数的执行原理:调用时执行,执行完消失*/
/*int he = add(8, 9);
printf("%d\n",he);
printf("%d %d\n",add(10,20),add(109,110));*/
//入“坑”
int arr[] = {4,9,8,3,5,8,7,3,10,11};
printf("%d\n",add_all(arr,10));
printf("%d\n",add_all_2(arr));
/*函数的数据(值)传递为:copy(复制)方式 */
/*自定义头文件*/
return 0;
}
//函数:定义状态
int add(int a,int b)
{
int sum=0;
sum=a+b;
return sum;
}
int add_all(int a[] ,int len)
{
int sum=0;
//int len=sizeof(a)/sizeof(a[0]);
int i;
for(i=0;i<len;i++)
{
sum+=a[i];
}
return sum;
}
// 数组指针
int add_all_2(int (*a)[10])
{
int sum = 0;
int i;
for (i = 0; i < 10; i++)
{
sum += (*a)[i];
}
return sum;
}
八、函数的数据传递
值传递
牵扯到局部变量的问题,局部变量只在函数内部起作用,一旦函数执行完成,局部变量也被回收。
数值传递是指在编程中,将一个数值作为参数传递给函数或方法。这种传递方式通过将数值的值复制给函数的参数,使得函数在执行过程中可以使用该数值进行计算或其他操作。在数值传递中,原始数值本身不会被改变,因为函数只是使用了其副本。这种传递方式通常用于简单的数据类型,如整数、浮点数等。
#include <stdio.h>
//函数的声明状态
int add(int a, int b);
int add_all(int a[],int len);
int add_all_2(int (*a)[10]);
int main()
{
/*函数的数据(值)传递为:copy(复制)方式 */
int a = 4, b = 6;
printf("a = %d b = %d\n", a, b);
/*int t;
t = a; a = b; b = t;*/
void exchange(int a, int b);
exchange(a, b);
printf("a = %d b = %d\n", a, b);
/*自定义头文件*/
return 0;
}
void exchange(int a,int b)
{
int t;
t = a; a = b; b = t;
return;
}

地址传递
在地址传递中,函数接受参数的是变量的地址(指针),而不是变量的值。通过地址传递,函数可以修改传入的变量的值,因为它直接操作的是变量的内存地址。
#include <stdio.h>
int main()
{
/*函数的数据(值)传递为:copy(复制)方式 */
int a = 4, b = 6;
printf("a = %d b = %d\n", a, b);
void swap(int* a, int* b);
swap(&a, &b);
printf("a = %d b = %d\n", a, b);
return 0;
}
void swap(int*a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
}
值传递与地址传递

总结
总的来说,函数是C语言中非常重要且灵活的概念,合理的函数设计和使用可以帮助提高程序的可维护性和可读性。

5万+

被折叠的 条评论
为什么被折叠?



