数组与函数
- 数组是一种构造数据类型,它将相同类型的变量组合起来,用一个名称来表示。
- 相同性质的一组数据的集合——数组元素数据类型相同。
- 为了声明数组,需要说明数组元素的类型和数量(长度)。
int data[5];
data[5]=10; (错误)
注意:C语言不对数组进行越界查询,在程序中data[5]相当于不存在。
例:输入10个整数求其中的最大值最小值。
#include<stdio.h>
int main()
{
int x[10],i,max,min;
printf("Enter the 10 integers:\n");
for(i=0;i<10;i++)
{
scanf("%d",&x[i]);
}
max=min=x[0];
for(i=1;i<10;i++)
{
if(max<x[i]) max=x[i];
if(min>x[i]) min=x[i];
}
printf("max value is %d\n",max);
printf("min value is %d\n",min);
return 0;
}
结果
函数
函数类型 函数名(形参类型说明表)
{
说明部分
语句部分
}
函数的调用与返回过程
- 函数A调用被调函数B,在调用函数B前需要在函数B的数据存储区中保存返回地址(程序流程返回到函数A后,继续执行的指令的地址)和CPU寄存器当前的内容(也称为保存CPU现场);
- 函数B执行结束,需要恢复CPU现场,并取出返回地址,使得程序流程返回到函数A。
- 保存CPU现场和返回地址,恢复CPU现场和返回地址,由系统自动完成
函数的数据存储区
- 函数被调用时,需要为函数分配数据存储区,进行返回地址、主调函数的CPU现场和被调函数的局部变量的存储。
- 函数的局部变量包括形参变量和函数体内定义的变量。
- 局部变量在函数被调用前不占内存;调用时为其分配内存。
- 函数执行结束,需要释放函数的局部数据存储区 。
函数参数传递方式
-
值传递方式:形参 = 实参,调用时,用实参初始化形参方式:将实参的值(单向)复制给对应的形参。形参与实参占用不同的内存单元单向值传递,被调函数不能访问主调函数的存储空间地址。
-
地址传递方式:形参 = 实参,调用时,用实参初始化形参方式:函数调用时,将数据的存储地址作为参数传递给形参。函数调用时,将地址的值传递给形参指针,作为形参指针的值,使得形参指针指向实参地址对应的数据被调函数中的指针变量通过间接访问方式,可以修改主调函数的数据
注:其实值传递就是常用的传递方式,只需要传入变量的值,而变量的值不需要修改。
如:
#include<stdio.h>
void swap(int i,int j)
{
int temp;
temp=i;
i=j;
j=temp;
}
int main()
{
int x=1,y=20;
printf("before exchange: %d,%d\n",x,y);
swap(x,y);
printf("after exchange: %d,%d",x,y);
}
结果:实际上整型变量x,y的值并没有改变,改变的是swap函数内部的局部变量。
而地址传递则传递的为变量的地址,此时不但可以访问变量的值还可以改变地址内存储的值即变量的值。
如:
#include<stdio.h>
extern void swapPoi(int *i,int *j);
int main()
{
int x=1,y=20;
printf("before exchange: %d,%d\n",x,y);
swapPoi(&x,&y);
printf("after exchange pointer: %d,%d\n",x,y);
}
void swapPoi(int *i,int *j)
{
int temp;
temp = *i; *i = *j; *j = temp;
}
结果:
这里用指针传递变量的地址,即达到了变量x,y的交换。