函数是什么及怎么定义、怎么使用

原博客地址:http://www.codertown.cn/blog/?p=141

函数相关,比如编译之后是什么,函数名的表,定义函数,涉及到return、形参、实参等等,什么是参数

一、函数使用方法
什么是函数,可自行百度百科可得到原始的定义,其实就是一个数函另一个数,简称函数。简单的理解就是一个数通过一个算式得到另外的数。

比如y = x + 4; x和y的关系式不变,给一个x就能得到一个y。

先来看下编程中的函数是怎样的。

int function(int x)
{
return x + 4;
}

这是一个简单的函数定义,就好比我们给了你一个式子,或者一串代码,你只要根据传入的x,就能得到一个y;定义了怎么使用呢?
下面是一段代码:
//example 1
#include

int function(int x)
{
return x + 4;
}

int main(int argc, char *argv[])
{
int a = 5, b;
b = function(a);
printf(“b = %d\n”, b);

return 0;
}
通过这段代码,在linux终端下,执行gcc main.c即可生成在该平台下可用的可执行程序a.out。
数学中,我们需要一个固定的式子,用人脑计算结果,但是在计算机的世界里,CPU帮我们把事情给做了,你只需要找到方法怎么去做这件事就好。
main本身也是一个函数,只不过它是程序的入口,所以没提到多少,其实它也会被调用,而且要有返回值。
1、函数定义的各个方面
在function为名字的函数定义中,前面的int表示返回值类型,括号中的int x表示形参,return关键字就是表示把这个值返回。
2、函数调用
这里带有返回值,所以我们需要用一个变量将返回值存储以备调用;还要给函数名后面括号中放一个实际的值,可以是变量也可以是常量,这里直接放的是a, a就是实参(具体的,实际上的参数),相当于代入a,通过算式function算出b的值;
3、函数的声明
一般情况下,如果在一个代码文件中,函数的定义写在调用函数之前,则可以省去声明;而如果写在调用后面,则需要先声明再调用。比如下代码:
//example 2
#include

int function(int x);

int main(int argc, char *argv[])
{
int a = 5, b;
b = function(a);
printf(“b = %d\n”, b);

return 0;
}
int function(int x)
{
return x + 4;
}
前面写的function只是声明下,告诉下面要用的代码,我这有定义呢,别乱用。

二、深入理解函数
程序中的变量,函数都是有相应的内存地址的,在编译链接完成之后就会给其分配内存地址,生成的二进制文件都是用地址和指令表示的。
所以,上述例子中,a,b,x,y,function,main等都是有其内存地址的,只不过通常情况下,我们并不关心具体地址是多少。
在一个函数中,形参是在定义函数的时候括号中的变量,可以有多个,用逗号分开。在程序运行的时候,这些变量是存放在栈中的,也就是临时变量区,每个函数都有自己的栈区,用来存放局部变量(包括形参和该函数用大括号括起来的代码中的变量),存放顺序是最右边的存放在高地址部分,最左边的存放在低地址,所以入栈顺序为从右到左。我们可以用一段测试代码打印出地址即可知道:

void function(int x, int y, int z)
{
printf(“&x = 0x%x\n”, &x);
printf(“&y = 0x%y\n”, &y);
printf(“&z = 0x%z\n”, &z);
}
通过调用该函数,执行后可在屏幕打印显示x,y,z的地址即可验证。

还有一个问题,在执行程序的时候怎么知道程序的地址:
在C程序编译完成后,会生成一个函数符号表,该表中一个函数名对应一个地址,汇编中也就是一个标号对应一个地址。
此时,程序运行时则可知道该到哪里去执行接下来的代码块。

对于return,一般说,return在函数中不可返回局部变量,因为局部变量存放在栈中,函数返回该内存空间就会被销毁,通常是这样,不过现在的编译器好像做了优化还是怎么地,局部变量也是可以返回的。

相关函数部分先说这么多,有问题再补充。

碎觉。


你可能感兴趣的:(C语言)