C语言中一个完整的函数由函数首部和函数体构成,而且定义函数时两者都是必不可少的。函数定义的一般形式如下:类型标识符 函数名(形参表列) // 这是函数首部 // 以下{ }内的是函数体 { 说明部分执行部分 } 举例说明如下: // 定义一个不带返回值的函数 // 函数功能:输出形参的值 void fun(int a, int b) { printf("%d, %d\n", a, b); } // 定义一个带返回值的函数 // 函数功能:返回2个整数数的最大值 int fun(int a, int b) { return ab ? a : b; }
创新互联公司成立于2013年,我们提供高端重庆网站建设公司、成都网站制作、成都网站设计、网站定制、网络营销推广、小程序开发、微信公众号开发、seo优化排名服务,提供专业营销思路、内容策划、视觉设计、程序开发来完成项目落地,为成都木屋企业提供源源不断的流量和订单咨询。
inc(a,b)是自增函数
取地址。单目运算符。用来取一个变量的地址
程序的执行效率非常高(瞬间就完成):
#include "stdio.h"
int fun(int n)
{int i,s=n+1;
for(i=2;i*in;i++)
if(n%i==0)s+=i+n/i;
if(i*i==n)s+=i;
return s;
}
main()
{ int k;
scanf("%d",k);
printf("%d\n",fun(k));
}
对于函数,有两个概念要理解好
那就是实参和形参。
形参是在函数的原型里面的参数值,如下面函数原型
void inc(int a);
a就是形参,如果在使用的时候,给函数传递一个变量,如
int x = 5; //在这里x只是一个变量
inc(x);// 把他递给函数时,他就是函数运行时的一个参数,与a不同的是,x叫做实参,因为参与实际的运算。
而a只是表明一个变量,甚至上面的函数原型可以写为
void inc(int);//a没必要存在。
不过在实现这个函数时,就必须指明形参的名字,毕竟要操作他嘛。
void inc(int a)
{
a = a + 1;
}
上面讲了什么是形参,什么是实参。
形参是在定义函数原型,或者实现函数功能时用的,
而实参是在调用函数时使用的。
调用过程,会把x送给函数inc,但是这种说法很表面,具体说,应该是把x的值的大小送给inc。也就是函数的参数传递是传值的形式
我在main函数里定义了一个变量x,并初始化为5;
int x = 5;
如果调用inc(x),这样的调用不会改变变量x所对应的内存空间里面的数据,
这里用到传值,意思就是只是把x对应的值传给函数,而x对应的内容是不会变的。
要想改变x的内容,必须传递指向x的指针。
上面的函数可以改写成下面这个。
void inc(int *a) //这里的*用于定义a为一个指针,指向int类型
{
(*a) = (*a) + 1; //这里的*含义和上面的不同,表示使用地址a对应的值
}
调用时使用
inc(x);// 是取地址符
这样,就能改变x的值
下面是一个程序可以测试
#include stdio.h
void Inc1(int a);
void Inc2(int *a);
int main()
{
int x = 5;
Inc1(x);
printf("x的值为5,使用传值的函数后,x的值为:%d\n",x);
Inc2(x);
printf("x的值为5,使用传地址的函数后,x的值为:%d\n",x);
return 0;
}
void Inc1(int a)
{
a = a + 1;
}
void Inc2(int *a)
{
*a = *a + 1;
}
解决办法:
上面的函数改写为
void f(int *x, int *y)
{ int t;
if(*x *y) {
t=*x;*x=*y;*y=*t;
}
}
调用时使用
f(a,b);f(a,c);f(b,c); 即可。
不过对于指针的操作要小心,在C++里面使用了另外一种函数实参到形参的技术,叫做引用,可以很方面的实现这个功能,同时避免了指针操作带来的问题。
下面是c++的写法
#include iostream
using namespace std;
void f(int x, int y) //这个时候不是取地址了,而是表示变量的引用
{ int t;
if(xy)
{
t=x;x=y;y=t;
}
}
int main()
{
int a=4,b=3,c=5;
f(a,b);f(a,c);f(b,c);
couta' 'b' 'cendl;
return 0;
}
建议,标准的c或者c++的程序都必须使用如下原型
int main()
{
}
至于要不要使用return关键字,去返回一些结果,看你程序的功能及结构,标准的是可以不return的,但是如果你是在VC环境下编程的话,不return会报错,我只能说微软太TMD。
我都是在linux用gcc的,比较符合标准。
以上程序,都在一个IDE下实现测试过
那个IDE的网址是
前面弄的那个格式错乱了!所以重新弄了一遍,这次应该没问题了!
(1)无参函数的定义一般形式:
类型说明符 函数名()
{
类型说明符
语句
}
例如: void Hello()
{
printf("Hello,world");
}
(2)有参函数的定义一般形式:
类型说明符 函数名(形式参数表)
{
类型说明符
语句
}
例如: int max(int a,int b)
{
if(ab)
return a;
else
return b;
}
其中类型说明符指明了本函数的类型,函数的类型实际上是函数返回值的类型,它们通常是C语言的
基本数据类型.
函数名incx,加一个括号证明是一个函数,没有参数,证明是一个无参函数,需要自定义