函数指针和指针函数

函数指针    //指向函数的指针

指针函数   //函数的返回值是一个指针的函数

************函数指针***************

typedef int (*pfun_t)(int ,int ,int*);

int add(int x,int y,int* ret);     //函数声明

int main(int argc, const char * argv[]) {

 //函数指针声明

int (*p)(int ,int ,int*) = NULL;   //函数指针

p = add;    //函数指针赋值


p(3,4,&result);     //函数指针只能引用,不能做指针运算和篡改

    

printf("%d\n",result);


return 0;


}

{

    //先变量声明

    int sum = 0;

    //合法性检查 --para illegal check

    

    //需求分析 --demand

    sum = x + y;

    

    //处理返回值

    return sum;

}

//回调函数

int operate(int x,int y,pfun_t pfun)

{

    int ret = 0;

    //函数参数合法性检查

    if (x == 0) {

        return -1;

    }

    if (y == 0) {

        return -1;

    }

    if (pfun == NULL) {

        return -1;

    }


    //

    pfun(x,y,&ret);

    

    //函数返回值

    return ret;

}



************指针函数***************

代码:

char* analysis(char* s,char ch,int* ndx);


int main(int argc, const char * argv[]) {

    int index = 0;

    

    //找到某个特定字符出现的位置

    char string_buffer[] = "hello world";

    char* ret = NULL;

    

    //需求分析 :自顶向下分析法,逐步求精

    ret = analysis(string_buffer,'o',&index);

    printf("文本分析的结果为:从第%d个字符开始截取的文字段的内容:%s\n",index+1,ret);

    

    return 0;

}


//返回的数据类型是指针

char* analysis(char* s,char ch,int* ndx)

{   int i = 0;

    //求取字符在字符串中的特定位置,并返回

    for (i=0; s[i]!='\0'; i++) {

        if (s[i] == ch) {

           

            break;

        }

    }

    

    *ndx = i;   

    return s+i;

}

函数完成后分析:

1.参数非法?  //入参检查

2.逻辑是否缺失?    //

3.程序测试?   //1.简单需求(可用性) 2.非法需求(健壮性)


//***********************************指针知识梳理*****************************************

//指针是一种对数据的间接引用,这种引用通过地址来获得,
//指针类型由两部分组成,指针的指向类型 和 *;
//指针的指向类型可以使任意的合法的c语言的数据类型

   //指针前面的指向类型决定了该指针的类型

    int* p;        //一维指针

    int** pp;       //二维指针

    void* ppp;     //泛型指针(数据指针),不能++

    int (*pppp)(int,int,char*);    //函数指针,也不能++

    //函数名,数组名不能被赋值,不能被计算(++),但能被拷贝

    //字符串常量是指针,也不能被赋值,但能被拷贝

    char* p10 = NULL;

    p10 = "hello world";

    printf("%s\n",p10+3);

    printf("%s","hello world"+2);     //“hello world”是常量指针


   char* p10 = "hello world";   //有空间的常量指针


*p10 = ‘H’;   //error:    p10现在指向常量区,不能重新赋值


   char* p11 = {'h','e','l','l'}; //error:没有空间只有数据内容


   char p12[] = {'h','e','l','l'};  //数组自动申请空间


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值