1. 函数
1.1 杂记
1)C源程序是由函数组成的,函数是C源程序的基本模块。
2)函数定义在调用后,应进行声明。int型函数无论在何处定义,其声明均可省略。
3)形参只有在函数调用是分配内存单元,调用结束,立即释放内存单元,因此只能在函数内部使用。
4)实参可以是常量、变量、表达式、函数等。无论什么类型,都必须有确定的值。
5)return只能返回一个函数值。函数值的类型和函数定义中函数的类型应保持一致。(还比较重要吧,因为你想返回什么值,决定你定义什么函数)
如 int max{return m; //m必须是int型}
6)不返回函数值的函数,可以明确定义为“空类型”,类型说明符为“void”
7)函数调用有个递归算法
2 指针与函数(经典例子)
void swap(int a,int b) /*定义函数*/
{ int c;
c=a;
a=b;
b=c;
printf("(1)a=%d,b=%dn",a,b);
}
void main()
{
int a=12,b=25;
swap(a,b); /*调用函数*/
printf("(2)a=%d,b=%dn",a,b);
}
输出:(1)a=25,b=12
(2)a=12,b=25
swap里的函数实现了形参交换,但是并未改变实参的值。
void swap(int *a,int *b)
/*定义函数*/
{ int c;
c=*a;
*a=*b;
*b=c;
printf("(1)a=%d,b=%dn",*a,*b);}
void main()
{
int a=12,b=25;
swap(&a,&b); /*调用函数*/
printf("(2)a=%d,b=%dn",a,b);
}
输出:(1)a=25,b=12
(2)a=25,b=12
实参改用a、b的地址,形参也必须用指针变量接收实参的传值。也就是定义一个int *p=&a;
真正的改变了实参的值,实现了通过指针间接访问。
3.数组作为函数参数
3.1 数组元素作为函数参数
数组元素就是下标变量,它与普通变量并无区别。因此是单向传输。
3.2 数组名作为函数参数
实参是数组名,形参就取得数组首地址。形参数组和实参数组为同一数组,共同拥有一段内存空间。
因为实参是数组名,也就是地址,因此形参定义形式指针变量或数组。
-
返回指针值的函数
函数返回值不仅可以是整型、实型、字符型等数据,还可以是指针类型,即存储某种数据类型的内存地址。
即函数也要是指针型函数。
定义:
数据类型 *函数名()
在指针型函数中,返回的地址值可以是变量的地址、数组的首地址或指针变量,还可以是后面介绍的结构体、共用体(也叫联合体)等构造数据类型的首地址。 -
指向函数的指针
在C语言中,函数名表示该函数的存储首地址,即函数的执行入口地址
数据类型 (*函数指针名)( );
int (*pf)();
pf=func;
则指针变量pf指向了函数func,即指针变量pf中存放该函数的入口地址。
6. 变量的作用域
1)局部变量
局部变量也称为内部变量,顾名思义是在函数内部定义的变量,只在函数体内有效(准确来说是{},只是为了方便称呼才说函数),离开该函数后再使用这种变量是非法的。
main() /*m、n的作用域限于main函数内。*/
{ int m,n;……}
#include <stdio.h>
void main()
{ int i=2,j=3,k;
k=i+j;
{
int k=8;
printf("%dn",k); //输出8,在大括号只能大括号用,用了就释放
}
printf("%dn",k);//输出5
}
2)全局变量
全局变量可以被整个C程序中所有的函数所共用。它的作用范围是从定义的位置开始一直到整个C程序结束。
因此占用内存。
7.变量的存储类型
从变量值存在的时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式。
从用户存储空间可以分为三个部分(如图7.4所示):①程序区;②静态存储区;③动态存储区。
1)auto变量
不加static的存储类别,都是auto(动态)存储,如上面讲的{}、或称函数
关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式
2)static
局部变量的值在函数调用结束后不消失而保留原值,用关键字static进行声明。静态存储区。
#include <stdio.h>
f(int a) /*可以省略函数类型但被默认为int型或char型*/
{ auto b=0; /*int可以省略,b默认为int型*/
static c=3; /*int可以省略,c默认为int型*/
b=b+1; //1 1 1
c=c+1; //4 5 6
// a 2 2 2
return(a+b+c); // 7 8 9
}
void main()
{
int a=2,i;
for(i=0;i<3;i++)
printf("%d ",f(a));
}
输出:7 8 9
3)register变量
register 数据类型标识符 变量名表;
局部变量的值放在CPU中的寄存器中,寄存器变量是局部变量。
寄存器 > 缓存 > 内存 > 固态硬盘 > 机械硬盘
4)extern
全局变量,可省略不写,一般默认在函数外都叫全局变量。静态存储区。