定义函数的一般形式:
return_type function_name(parameter list)
{
body of the function
}
return_type:返回类型,有些函数执行所需的操作而不返回值,在这种情况下,return_type是关键字void
function_name:函数名称,函数名和参数列表一起构成了函数签名
parameter list:参数列表,参数就像占位符。当函数被调用时,向参数传递一个值。参数列表包括函数参数的类型、顺序、数量
body of the function:函数主体包含一组定义函数执行任务的语句
求俩个数大小实列:
#include<stdio.h>
int max(int num1,int num2)
{
/*局部变量声明*/
int result;
if (num1>num2)
result=num1;
else
result=num2;
return result;
}
函数声明
函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义
在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,应该在调用函数的文件顶部声明函数
调用函数
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序
例如:
#include<stdio.h>
int mian()
{
/*局部变量声明*/
int a=100;
int b=200;
int ret;
/*调用函数来获取最大值*/
ret = max(a,b);
printf("Max value is : %d\n",ret);
return 0;
}
/*函数返回两个数中较大的那个数*/
int max(int num1,int num2)
{
int result;
if(num1>num2)
result = num1;
else
result = num2;
return result;
}
函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数
形式参数就像函数内部的其他局部变量,在进入函数时被创建,退出函数时被销毁
两种向函数传递参数的方法
- 传值调用
把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数
实例:
void swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
return;
}
通过传递实际参数来调用函数swap():
#include<stdio.h>
void swap(int x,int y);
int main()
{
int a =100;
int b =200;
printf("交换前a的值:%d",a);
printf("交换前b的值:%d",b);
swap(a,b);
printf("交换后a的值:%d",a);
printf("交换后b的值:%d",b);
return 0;
}
上面的代码被编译执行后,结果如下:
交换前a的值:100
交换前b的值:200
交换后a的值:100
交换后b的值:200
虽然在函数内部改变了a和b的值,但实际上a和b的值没有发生变化
-
引用调用
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作传递指针可以让多个函数访问指针所引用的对象,而不是把对象声明为全局可访问
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
return ;
}
通过引用传值来调用swap():
#include<stdio.h>
void swap(int *x,int *y)
int main()
{
int a = 100;
int b = 200;
printf("交换前a的值:%d",a);
printf("交换前b的值:%d",b);
swap(&a,&b);
printf("交换后a的值:%d",a);
printf("交换后b的值:%d",b);
return 0;
}
编译执行后,结果为:
交换前a的值:100
交换前b的值:200
交换后a的值:200
交换后b的值:100
作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。c语言中有三个地方可以声明变量:
1.在函数或内部的局部变量
2.在所有函数外部的全局变量
3.在形式参数的函数参数定义中
局部变量
在某个函数或块的内部声明的变量,它们只能被该函数或该代码块内部的语句使用
局部变量保存在栈中,只有在 所在函数被调用时才动态地为变量分配存储单元。局部变量被定义时,系统不会对其初始化
全局变量
全局变量定义在函数的外部,通常是在程序的顶部。全局变量在整个程序生命周期内都要效,在任何的函数内部都能访问全局变量
全局变量保存在内存的全局存储区中,占用静态的存储单元
形式参数
函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用
数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。
声明数组
要声明一个数组,需要指定元素的类型和元素的数量
type arrayName [ arraySize]
这叫一维数组。arraySize必须是一个大于0的整数常量,type可以是任意有效的c数据类型。
初始化数组
double balance[5]={1000.0,2.0,3.4,7.0,5.6}
大括号之间的值得数目不能大于方括号中指定得元素数目
所有的数组都是以0作为它们第一个元素的索引,也被称为基索引
访问数组元素
数组元素可以通过数组名称加索引进行访问
double salary = balance[9]
声明数组、数组赋值、访问数组实例:
#include<stdio.h>
int main()
{
int n[10];
int i,j;
for (i = 0 ; i < 10 ; i ++)
{
n [ i ] = i + 100;
}
for (j = 0 ; j < 10 ; j++)
{
printf("Element[%d] = %d\n",j,n[j])
}
return 0;
}
多维数组
声明形式:
type name[size1][size2]...[sizeN];
二维数组,在本质上是一个一维数组的列表。声明一个x行y列的二维数组
type arrayName[x][y];
初始化二维数组:
int a[3][4] = {
{0,1,2,3}, /* 初始化索引号为0的行 */
{4,5,6,7}, /* 初始化索引号为1的行 */
{8,9,10,11} /* 初始化索引号为2的行 */
};
内部嵌套的括号是可选的,可以去掉
传递数组给函数
下面这个函数,它把数组作为参数,同时还传递了另一个参数,根据所传的参数,会返回数组中各元素的平均值
#include<stdio.h>
double getAverage(int arr[],int size);
int mian()
{
int balance = {1000.0,2,3,17,50};
double avg;
avg = getAverage(balance,5);
printf("平均值是:%f",avg);
return 0;
}
double getAverage(int arr[],int size)
{
int i;
double avg;
double sum = 0;
for (i=0 ; i<size ; ++i)
{
sum += arr[i];
}
avg = sum/size;
return avg;
}
从函数返回数组
c语言不允许返回一个完整的数组作为函数的参数,但是可以通过指定不带索引的数组名来返回一个指向数组的指针
如果想要从函数返回一个一维数组,必须声明一个返回指针的函数
int * myFunction()
{
...
}
C语言不支持在函数外部返回局部变量的地址,除非定义局部变量为static变量
下面的函数,它会生成10个随机数,并使用数组来返回它们
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/* 要生成和返回随机数的函数 */
int * getRandom()
{
static int r[10];
int i;
/* 设置种子 */
srand( (unsigned)time(NULL) );
for ( i=0 ; i<10 ; ++i)
{
r[i] = rand();
printf("r[%d] = %d\n",i,r[i]);
}
return r;
}
/* 调用上面定义函数的主函数 */
int main()
{
/* 一个指向数组的指针 */
int *P;
int i;
p = getRandom();
for ( i=0 ; i<10 ; i++)
{
printf("*(p + %d) : %d\n",i,*(p+i));
}
return 0;
}
指向数组的指针
数组名是一个指向数组中第一个元素的常量指针。因此,*(balance+4)是一种访问balance[4]数据的合法方式
一旦把第一个元素的地址存储在p中,就可以使用p、p+1、*(p+2)等来访问数组元素
#include<stdio.h>
int mian()
{
double balance[5] = {1000.0,2.0,3.4,17.0,5.6};
double *p;
int i;
p = blance;
printf("使用指针的数组值\n");
for ( i = 0; i < 5; i++ )
{
printf("*(p + %d) : %f\n",i,*(p+i));
}
printf("使用balance作为地址的数组值\n");
for ( i = 0; i < 5; i++ )
{
printf("*(balance + %d) : %f\n",i,*(balance+i));
}
return 0;
}
上面的实例中,p是一个指向double型的指针,这意味着它可以存储一个double类型的变量。一旦有了p中的地址,*p将给出存储在p中相应地址的值