一、函数:
函数原型:
所有的函数都应该具有原型,尤其是那些返回值不是整数的函数。
无形参的函数原型 int * func(void);
传递给函数的标量参数————传值调用
传递给函数的数组参数————传址调用
例子:返回某个int型数据在数组中的位置的函数:
1 #include<stdio.h> 2 int * find_int(int key, int array[], int length) 3 { 4 int i=0; 5 for(i=0;i<length;i++){ 6 if(array[i])==key) 7 return &array[i]; // 返回的是指向该位置的指针 8 } 9 return null; //此处不要省略,更加规范 10 }
c中进行数据交换的函数以及调用:
函数:
1 void swap(int *x ,int *y) 2 { 3 int temp; 4 temp = *x; 5 *x = *y; 6 *y = temp; 7 }
函数调用: swap(&a , &b);
ADT(抽象数据类型)和黑盒:
c通过 设计和实现抽象数据类型 可以限制函数和 数据定义的作用域
抽象数据类型的基本思想 ----模块具有功能说明----模块所执行的任务和接口说明----模块的使用
模块的用户并不需要知道模块实现的任何细节,并且除了已经定义好的那些接口以外, 用户不能一任何方式访问模块。
基本思想:限制对模块的访问是通过static关键字的合理使用实现的,他可以限制对那些并非接口的函数和数据的访问。
递归函数:
当函数被调用时,变量的空间是创建于运行时堆栈上的。以前的函数的变量仍保留在堆栈上,被覆盖。
例子: //接收一个整型数,转换为字符,并打印
1 #include<stdio.h> 2 void binary_to_ascii(unsigned int value) //假设输入是4267 3 { 4 unsigned int quotient; 5 quotient = value/10; 6 if(quotient !=0) 7 binary_to_ascii(quotient); 8 putchar(value%10+‘0‘); 9 }
递归与迭代:
如斐波那契函数,递归调用将设计一些运行时开销,参数必须压在堆栈中,为局部变量分配内存空间,寄存器的值必须保存。
n<=1:1
Fibonacci(n)= n=2:1
n>2 : Fibonacci(n-1)+ Fibonacci(n-2)
如用递归调用代价:远远不止一个冗余计算,每个递归都触发另外两个递归调用。
用迭代法实现:
1 long fibonacci (int n) 2 { 3 long result; 4 long previous_result; 5 long next_older_result; 6 result = previous_result = 1; 7 while(n>2){ 8 n-=1; 9 next_older_result = previous_result; 10 previous_result = result; 11 result = previous_result+next_older_result; 12 } 13 return result; 14 }
可变参数列表
宏 stdarg 定义与 stdarg.h 头文件 (包括 一个类型 va_list 和 三个宏 va_start va_arg va_end)
例子:(计算指定数量的值的平均值)
1 #include<stdarg.h> 2 float average(int n_values , ...) //注意参数列表的省略号,且参数列表中至少要有一个命名参数 3 { 4 va_list var_arg; //声明va_list类型的变量与三个宏配合使用 5 int count; 6 flout sum = 0; 7 8 va_start (var_arg,n_values); //准备访问可变参数 var_arg 通过va_start宏 进行初始化 9 10 for(count = 0 ; count <n_values ; count+=1) 11 { 12 sum+= va_arg(var_arg , int); //添加取自可变参数列表的值。 13 } 14 15 va_end(var_arg) ; //完成处理可变参数 16 17 return sum/n_values;
二、数组
时间: 2024-10-17 20:50:22