C-函数、函数与指针

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=122)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=122)a=25,b=12

实参改用a、b的地址,形参也必须用指针变量接收实参的传值。也就是定义一个int *p=&a;真正的改变了实参的值,实现了通过指针间接访问。
在这里插入图片描述
3.数组作为函数参数
3.1 数组元素作为函数参数
数组元素就是下标变量,它与普通变量并无区别。因此是单向传输。
3.2 数组名作为函数参数
实参是数组名,形参就取得数组首地址。形参数组和实参数组为同一数组,共同拥有一段内存空间。
因为实参是数组名,也就是地址,因此形参定义形式指针变量数组

  1. 返回指针值的函数
    函数返回值不仅可以是整型、实型、字符型等数据,还可以是指针类型,即存储某种数据类型的内存地址。
    即函数也要是指针型函数。
    定义:
    数据类型  *函数名()
    在指针型函数中,返回的地址值可以是变量的地址数组的首地址或指针变量,还可以是后面介绍的结构体、共用体(也叫联合体)等构造数据类型的首地址

  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
全局变量,可省略不写,一般默认在函数外都叫全局变量。静态存储区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值