下面为名为printMassage地函数:
void printMessage (void)
{
NSLog (@"Programming is fun.");
}
第一行函数定义会向编译器说明函数地4件事:
谁可以调用这个函数。
函数的返回值类型。
函数的名称。
函数使用的参数数目和类型。
与方法不同,这里不必将函数的返回类型放在一对圆括号中而且参数类型也不放在圆括号中,如果这样做,将得到一条编译错误的消息。
1。参数和局部变量
计算三角数的函数如下:
void calculateTriangularNumber (int n)
{
int i, triangularNumber = 0;
for ( i = 1; i <= n; ++i)
triangularNumber +=i;
NSLog (@"Triangular number %i is %i ",n,triangularNumber);
}
与方法不同,函数的参数类型不需要单独放在圆括号中,而是与变量一起放在圆括号中,并且可以是多个参数放在一个圆括号中,用逗号隔开。
在函数中,局部变量的作用同方法中的一样:如果在函数内给变量赋予初始值,那么每次调用该函数时,都会指定相同的初始值。如果使用了自动引用计数(ARC),那么每次调用函数(方法)时,局部对象的变量都会默认初始化为空。
在函数中(和方法中一样)定义的变量称为自动局部变量。因为每次调用该函数时,他们都会自动“创建”,并且它们的值对于函数来说是局部的。
静态局部变量用关键字static声明,它们的值在函数调用的过程中保留下来,并且初始值默认为0.
局部变量的值只能在定义该变量的函数中访问,不能从函数之外访问。
2.函数的返回结果
和方法一样,函数也可以返回值。return语句返回的值类型必须和函数声明的返回类型一致。
求最大公约数的代码为:
int gcd (int u,int v)
{
int temp;
while ( v!= 0)
{
temp = u%v;
u = v;
v =temp;
}
return u;
}
调用时,printf("%i",gcd(3,36));就可以完成调用。
这里可以省略函数的返回类型的声明,如果省略函数的返回类型的声明,函数确实返回任何值,编译器就会假设该值为整数。许多程序利用这个事实,省略整数的返回类型声明,但是这不是好的编程习惯,应该尽量避免。
函数默认的返回类型与方法默认的不同,如果没有为方法指定返回类型,编译器就会假设它返回id类型的值。同样要尽量声明返回类型。
无论什么时候调用一个函数,编译器都会假设这个函数的返回类型为int,除非发生以下两种情况之一:
在函数被调用之前,已经在程序中定义了该函数。
在遇到函数调用之前,已经声明了该函数的返回值类型。声明函数的返回值类型和参数参数类型称为原型声明。
函数声明不仅用于声明函数的返回类型,而且用于告知编译器,该函数带有多少个参数及类型。
要将absoluteValue定义为一个返回float型值并带有一个float类型参数的函数,可以使用原型声明:
float absoluteVlaue (float);
圆括号中指定参数类型,而不是参数名。也可以写成:float absoluteVlaue (float);这个名称函数定义所用到的不必相同,反正编译器会忽略它。
如果函数的参数数目不定(比如scanf和NSLog),必须告知编译器,如下:
void NSLog (NSString *format, ...);告知编译器,NSLog将 使用一个NSString对象作为它的第一个参数,之后是任意数目的附加参数。
只有已经在调用函数之前添加了函数定义或者声明了该函数及其参数类型时,编译器才会在调用该函数时自动将参数转换为相应的类型。
注意事项:
默认情况下,编译器假设函数返回int
定义返回值为int的函数时,直接将它定义为int
当定义没有返回值的函数时,直接将它定义为void
只有当前面已经定义或声明了这个函数,编译器才将参数转换成函数认可的类型。
为了安全起见,建议在程序中声明所有函数,即使他们在被调用之前已经定义了,因为将来你有可能将函数移到文件的其他地方或者一到另一个文件中,好的方法是将函数声明放到一个头文件中,然后只将这个头文件导入你的模块即可。
默认情况下,函数是外部的。即对于函数默认的作用域来说,所有与该函数链接在一起的文件中的所有函数或方法都可以调用它。通过将其定义为static(静态),可以限制函数的作用域。将关键字static放在函数声明之前即可。例如:
static int gcd (int u,int v)
{
}
静态函数只可以由和该函数定义位于同一文件的函数或方法调用。
3.函数 方法和数组
向函数或方法传递整个数组,只需在函数调用或者方法调用中列出数组名称,并且不需要任何下标。下面有一个函数用于寻找包含指定元素个数的数组中的最小整数值的代码:
int minimum (int values[], int numElements )
{
int minValue, i;
minValue = values[0];
for (i = 1;i< numElements; ++i)
if ( values[i] <minValue )
minValue = values[i];
return minValue;
}
此函数有两个参数第一个参数为要查找的最小参数的数组,第二个参数为数组中元素个数。在函数头中,values之后的一对方括号用来告知编译器,values是整型数组,编译器并不关心数组多大。
上面的函数也可以改成如下的代码:
int minimum (int values[] )
{
int minValue,i;
minValue = values[0];
for (i = 0; values[i] !='\0'; ++i)
if ( values[i] <minValue )
minValue = values[i];
return minValue;
}
如果函数或者方法更改了数组的值,那么这个变化将影响到传递到该函数或方法的原始数组,而且这个变化在函数或方法执行完之后仍然有效。我们说过,调用函数时,作为参数传递的值将被复制到相应的形参中。但是,使用数组时,并非将整个数组的内容复制到形参数组中,而是传递一个指针,他表示数组所在的计算机内存地址。