返回类型 函数名(参数1, 参数2…)
{
//函数体
(返回值, 除了void类型都要有返回值, 跟返回类型对应)
;
}
int main()
{return 0; //向操作系统返回0, 代表程序正常结束
}
自定义函数如果自己写的这个函数写在main函数前面, 就可以不写函数声明
如果写在main函数后面的话, 必须在main函数前面写他的声明
函数声明 → 函数类型 函数名(参数类型 (变量名), 参数类型 (变量名))
#include//add函数在main后面, 所以需要加一个函数声明
int add(int, int); //参数的名字可以省略
int main()
{int a = 5, b = 6;
printf("%d", add(a, b));
return 0;
}
int add(int a, int b)
{return a + b;
}
#include//不写声明
int add(int a, int b)
{return a + b;
}
int main()
{int a = 5, b = 6;
printf("%d", add(a, b));
return 0;
}
传值调用和传址调用#include//传值调用
void swap(int a, int b) //a 和 b是形式参数
{int t = a;
a = b;
b = t;
}
int main()
{int a = 3, b = 4;
printf("交换前a = %d b = %d\n", a, b);
swap(a, b); // a 和 b是实际参数
printf("交换后a = %d b = %d\n", a, b);
return 0;
}
#includevoid hahaha()
{printf("hahaha");
}
//传址调用
void swap(int &a, int &b) //a 和 b是形式参数
{int p = a;
a = b;
b = p;
hahaha();
}
int main()
{int a = 3, b = 4;
printf("交换前a = %d b = %d\n", a, b);
swap(a, b); // a 和 b是实际参数
printf("交换后a = %d b = %d\n", a, b);
return 0;
}
传值调用: 只是把swap(a, b) 里面a和b的 值 copy 了一份给了swap(int a, int b)里面的a 和 b
函数调用的时候传的参数 如swap(a, b); 里面的a 和 b 为实际参数
void swap(int a, int b) 里面的a 和 b为形式参数, a 和 b是定义在 swap这个栈空间里面新开的变量,只是把原来swap(a, b)里面a和b的值赋值给了它, 因此如果只是在swap(int a, int b)函数里面对a和b进行操作的话, 不会影响到main函数栈空间里面的a和b, 在执行完swap函数之后会销毁
swap(int *a, int *b) 也只是把a和b的地址作为参数传进来了,而并没有真正对a和b进行操作
传址调用: void swap(int &a, int &b) &相当于直接把a和b定义在内存中的地址给到了这个函数, 这个函数的操作会对内存中真正的a和b进行操作
全局变量全局变量定义在堆里面的, 如果对全局变量进行修改的话, 是会真正产生影响的
#includeint n = 10;
void add()
{n++; //真正对堆里面的n进行操作
}
int main()
{add();
printf("%d", n);
return 0;
}
//局部变量优先 → 仍然是对栈中的n进行操作, 不会对全局变量定义在堆中的n有影响
#includeint n = 10;
void add(int n) //实际影响的是栈里面的n, 而不是上面的定义在堆里面的n
{n++;
}
int main()
{add();
printf("%d", n);
return 0;
}
值为10的时候: n是定义在栈里面(局部变量) → 传值调用 / 局部变量优先, int add(int n) 跟 全局变量的n重名了
值为11的时候: 前提是n为全局变量, add的参数不是n
报错的情况: 前提是n为全局变量, add的参数不是n + 全局变量n定义在add函数后面
数组作为函数参数//如果传的是数组的话, 对数组元素进行操作会直接改变数组的值
#includevoid change(int q[]) // int* q
{q[1] = 2;
q[2] = 4;
}
int main()
{int q[5] = {0};
change();
printf("%d %d", q[1], q[2]);
return 0;
}
递推
递归
6-1 sdut-C语言实验-计算组合数int fun(int n, int m)
{//递归边界
if(m == 0 || n == 1 || m == n) return 1;
return fun(n - 1, m - 1) + fun(n - 1, m);
}
6-2 sdut-C语言实验- n个数的排序void sort(int *p, int n)
{for(int i = 1; i<= n - 1; i++)
{for(int j = 0; j< n - i; j++)
{if(p[j] >p[j + 1])
{int t = p[j];
p[j] = p[j + 1];
p[j + 1] = t;
}
}
}
}
void sort(int *p, int n)
{for(int i = 1; i<= n - 1; i++)
{for(int j = 0; j< n - i; j++)
{if(*(p + j) >*(p + j + 1))
{int t = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = t;
}
}
}
}
6-3 sdut- C语言实验——矩阵下三角元素之和上下三角都是以主对角线为界限
下三角 → j<= i
int f(int (*p)[10], int n)
{int sum = 0;
for (int i = 0; i< n; i++)
{for(int j = 0; j< n; j++)
{if(j<= i) sum += p[i][j];
}
}
return sum;
}
6-4 sdut-C语言实验- Nlong long int f(long long int n)
{long long ans = 1;
for(int i = 1; i<= n; i++)
{ans *= i;
}
return ans;
}
6-5 sdut-C语言实验-使用函数验证哥德巴赫猜想int isPrime(int x)
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧