C和指针 第七章 函数
函数声明
char *strcpy(char*, char*);//同样合法,但是没有表明变量含义
char *strcpy(char *destination, char *source);
函数参数
C语言的所有参数均以“传值调用”方式传递
传值调用:拷贝实参值,修改拷贝值,不用担心会修改实参
传址调用:实参为数组名,传值(数组地址)指针,修改数组实参
传递给函数的标量参数是传值调用
传递给函数的数组参数在行为上就像他们是通过传址调用一样
传值调用:偶校验(int中1个数为偶数返回1)
#include<iostream>
int parity(int value);
int n;
int main() {
using namespace std;
int value, cst;
cout << "请输入一个int值:";
cin >> value;
cst = value;
cout << cst << "的奇偶校验位:" << parity(value) << endl;
cout << cst << "中含有1的个数:" << n << endl;
}
int parity(int value) {
int bits_n = sizeof(value) * 8;
int flag;
int count = 0;//定义count为0的个数
if (value == 0)//以0(0x00000000)为极限
count = bits_n;
else if (value > 0) {
while (value != 0) {
count += value & 1;//查1
value >>= 1;
}
count = bits_n - count;
}
else if (value == -1)//以-1(0xffffffff)为极限
count = 0;
else
while (value != -1) {
count += !(value & 1);//查0
value >>= 1;
}
count = bits_n - count;
n = count;
flag = count % 2;
return flag;
}
符号数 | 左移 | 右移 | while极限值 |
---|---|---|---|
正数 | 补0 | 补0(符号位) | 0(0x00000000) |
负数 | 补0 | 补1(符号位) | -1(0xffffffff) |
传址调用:整数交换
#include<iostream>
void exchange(int *a, int *b);
int main() {
using namespace std;
int a, b;
cout << "请输入a值:";
cin >> a;
cout << "请输入b值:";
cin >> b;
cout << "执行交换函数后" << endl;
exchange(&a, &b);
cout << "a: " << a << endl;
cout << "b: " << b << endl;
}
void exchange(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
递归
将二进制整数转换为字符
#include<iostream>
void int2char(unsigned int a);
int main() {
using namespace std;
unsigned int num;
cout << "请输入一个无符号数:";
cin >> num;
cout << "无符号数转化为字符输出:" << endl;
int2char(num);
}
void int2char(unsigned int a) {
using namespace std;
char ch;
int b = a / 10;
if (b != 0)
int2char(b);
ch= a % 10 + '0';
cout<< ch <<" ";
}```
### 计算阶乘
```javascript
#include<iostream>
long factorial(int num);
int main() {
using namespace std;
int num;
long result;
cout << "请输入一个int值:";
cin >> num;
cout << num << "!= " << factorial(num) << endl;
}
long factorial(int num) {
if (num <= 0)
return 1;
else
return num * factorial(num - 1);
}
斐波那契数列
#include<iostream>
long fibon(int n);
int main() {
using namespace std;
int n;
cout << "请输入元素在斐波那契数列中的位置:";
cin >> n;
cout << "第" << n << "位Fibonacci数为:" << fibon(n) << endl;
}
long fibon(int n) {
if (n <= 2)
return 1;
else
return fibon(n - 1) + fibon(n - 2);
}
可变参数列表
stdarg=standard(标准)+arguments(参数)
#include<stdarg.h>
可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件,它是标准库的一部分。这个头文件声明了一个类型va_list和三个宏va_start、va_arg、va_end
int average(int num,...);
操作 | Value |
---|---|
va_list var | 声明可变参数列表的第一个参数var |
va_start(var,num) | 初始化var值为num后第一个实参值 |
va_arg(var,int) | 调用var值,指出(可变参数列表中)其后参数类型int,var更新 |
va_end(var) | 可变参数列表参数使用完毕,结束变量var |
#include<iostream>
#include<stdarg.h>
float average(int num, ...);
int main() {
using namespace std;
int a[7] = { 0,1,2,3,4,5,6 };
cout << average(3, a[1], a[2], a[3]) << endl;
cout << average(2, a[1], a[2]) << endl;
}
float average(int num, ...) {
float sum = 0;
int count;
va_list val;
va_start(val, num);
for(count=0;count<num;count+=1)
sum += va_arg(val, int);
va_end(val);
return sum/ num;
}