iOS基础知识:指针函数和函数指针

来源:互联网 发布:淘宝网店上架宝贝 编辑:程序博客网 时间:2024/06/05 22:56

指针函数:

        其实就是指针的函数,本质上还是一个函数

  函数的返回值,是一个指针的时候,就叫指针函数。


 定义语法:

        类型 * 函数名(参数列表){

            函数体;

        }

    注意:这个*可以放在类型和函数名中间的任意位置


 内存中有一个地方叫栈区,栈区里面放的是局部变量

 有一个特点:出了作用域,就会回收

    注意:C语言中的数据类型只要是局部的都是存在栈里面的

         用处的话:只能返回全局变量或者返回字符串常量,还可以返回静态变量的地址


#include <stdio.h>

int qNum = 40;

int *test(){ //函数名是test 返回值是int *

//    int num = 10;   

//    int *p = &num; 

//    return &num;   

      return &qNum;

}


char *test2(){ 

    char *str = "abc";

    return str;

}

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

    /*

    int *p = test();用int*类型的指针来接受同样类型的返回值

    int nums[100] = {0};

    printf("%d\n",*p);

    */

    char *strn = test2();//用char*类型的指针来接受同样类型的返回值

    printf("%s\n",strn);

    return 0;

}



函数指针:

        函数的指针,本质上一个指针,指向函数的指针,就是一个函数指针。


 我们写的源代码编译成二进制的指令集,一串交给CPU执行的指令

 先存在内存里面,然后CPU读取内存里的指令,既然存到内存里面,一定有一个地址

 所以,我们可以定义一个指针变量保存函数的地址,那么这样的指针变量就是函数指针

 

对比:普通指针和函数指针

 int num = 10;

 int *p = &num;


    函数指针定义语法

                返回值类型  (*指针变量)(参数列表);

         例: void (*pTest)(); //变量名:pTest   这个指针指向的是无返回值无参数的函数类型

                 void (*pTest2)(int);//变量名:pTest2  这个指向的是无返回值有1个int类型参数的函数


        tips:直接复制函数头,把大括号去掉,把函数名用一个小括号括起来,函数名前面加一个*,函数名重新改成变量名

 

    指针变量赋值:

            语法: 

                指针变量名 = 函数名;

            例: pTest = test;

            因为函数名本身就是一个指向自己函数的地址

            吐血要求:函数名后面千万不要加()

 

            在声明的时候初始化

                返回值类型 (*指针变量名)(参数列表) = 函数名;

                例:void (*pTest)() = test;


    函数指针的使用:

            1.指针变量名(参数列表);(推荐)

                pTest();

                pTest2(90);

            2.(*指针变量名)(参数列表);

            例: (*pTest)();

                (*pTest2)(90);



#include <stdio.h>

void test(){

    printf("test\n");

}


void test2(int num1){

    printf("num1=%d\n",num1);

}


void test3(int num1,int num2){

    printf("num1=%d   num2=%d\n",num1,num2);

}


int test4(int num1,int num2){

    return num1 + num2;

}

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

//    void (*pTest)(); //变量名:pTest   这个指针指向的是无返回值无参数的函数类型

//    pTest = test;

    

    void (*pTest)() = test;

    (*pTest)();

    

    void (*pTest2)(int);//变量名:pTest2  这个指向的是无返回值有1个int类型参数的函数

    pTest2 = test2;

    pTest2(90);

    

    void (*pTest3)(int,int) = test3;

    pTest3(20,30);

       

    int (*ptt)(int num1,int num2) = test4;

//    int res = ptt(10,40);

//    printf("res=%d\n",res);

    

    printf("%d\n",ptt(10,40));

    

    return 0;

}


0 0