Linux 基础---记录五之函数篇

1.函数定义

函数返回值(任意数据类型)   函数名(命名法则) (参数<任意数据类型>)

整形:

char

short (int)

int 

long (int)

long long (int )

实型:

float

double

long double

符合数据类型:

数组:指针体现

枚举  enum

结构体

联合体

指针:

2.函数与指针

1.指针函数

                指针函数:有指针参与的函数(返回值,参数)

参数:指针

经典例子:交换算法

    无法交换

 void exchange(int a,int b)
 {
 int tmp = a;
 a = b;
 b = tmp;
 }

    能交换

void exchange(int *a,int *b)
 {
 int tmp = *a;
 *a = *b;
 *b = tmp;
 }

   返回值:

        错误的写法

 int * fun()
 {
 int a=3;
 return &a;
 }

        正确的写法 

int * fun()
 {
 static  int a=3;
 return &a;
 }

2.函数指针

                    函数指针:指向一个函数的指针

 指针(32 4字节):1.地址   2.从这个地址开始的操作方式

 函数指针        :1.代码段的地址   2.从这个地址开始执行

 

 函数指针变量的定义方式:   返回值 (*变量名)(参数);   //int a;int *p=&a;

根据指向的函数参数和返回值的类型的不同,需要定义相应的指针去指向

void  fun(int ){

}

void (*p)(int);p=fun;

//------------------------

void fun1(int ,int );//p=fun1 error

void (*p1)(int,int ); p1=fun1   ;

函数指针的赋值:

void  fun(int ){

}

void (*p)(int) = fun;//int a=3;  初始化

p = fun;或者 p =&fun;   这两个的效果完全等价,让p指向fun函数

函数指针间接执行代码段方式:

//fun(2);

p(2);  或者 (*p)(2);  这两个的效果完全等价,都是间接执行p所指向的代码段

//函数指针作函数参数(回调,重点) 1.函数指针  2.结构体指针

关键字 volatile

     防止编译器优化,

     防止硬件、软件意想不到的改变

Gdb 工具的使用

查看文件

(gdb)l

设置断点

(gdb)b 6   (其中数字6是指行号)

查看断点情况

(gdb)info b

运行代码

(gdb)r

查看变量值

(gdb)p 变量名

单步运行

(gdb)n (如果遇到一个函数,并且函数内无断点,就把函数当成一条语句一次性运行完)

或者

(gdb)s (如果遇到一个函数,则会进入该函数中,一步一步运行)

恢复程序运行

(gdb)c 

帮助

(gdb) help [command]

sizeof的使用

        注意:

                sizeof(a)

相当于 

#define mysizeof(a)  (size_t)((char *)(&a+1) - (char *)&a)

                sizeof(type)

相当于

#define mysizeof_t(type)  (size_t)((type *)0+1) 

其中 注意 a 是变量不是常量! 

type 是数据类型,如 int , char等

size_t 实际上是 int ,但是由于每个系统 int 的字节大小不一定,所以用 size_t 代替

最终: sizeof() 

相当于

#define mysizeof_zj(x) (size_t)((typeof(a) *)0+1)

其中: typeof(x)是获得x的数据类型,这个x可以是常量


            不能对常量取地址!!! 

1+1=3 的情况

printf("%d\n",(int)((short *)1+1));

函数指针来模仿多任务(分时复用,时间片)

#include<stdio.h>
void task_qq()
{
    ;
}
void task_music()
{
    ;
}
int main()
{
    void (*pc)(void);
    int flag = 0;
    while(1)
    {
        if(0 == flag) //切换函数
        {
            pc = task_qq;
            flag = 1;
        }
        else
        {
            pc = task_music;
            flag = 0;
        }
        pc();
        //sleep(1);
    }
    return 0;
}


typedef 函数指针用法

格式:

typedef  返回类型(*新类型)(参数表)

例子:

        typedef char (*PTRFUN)(int);           
        PTRFUN pFun;   
        char glFun(int a){ return;}   
        void main()   
        {   
            pFun = glFun;   
            (*pFun)(2);   
        }

typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。


转载于:https://my.oschina.net/fengyeshangqing/blog/347318

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值