C语言基础-指针和函数的补充21

来源:互联网 发布:linux php编译 编辑:程序博客网 时间:2024/06/15 04:09

1.指针作为函数参数

1. 指针作为函数的参数.

    

    1).效果

        在函数的内部可以通过这个参数指针去修改实参变量的值.

        

    2).当函数的返回值有多个的时候.

 

 

    3).地址传递.

 

 

    4).如果函数的参数是1个指针.函数希望传递给调用者1个信息.

       函数内部只会去取指针指向的变量的值而不会修改.

       那么这个时候这个参数指针就是要const修饰.

 

 

 2. 指针作为函数的返回值

 

    1).指针当然可以作为函数的返回值.

        但是.不能返回局部变量的地址.

        换句话说:你返回的指针指向的变量一定要保证在函数结束之后,那个空间没有被回收还存在.

 

 

    2).如果你就是要返回1个指针,那么你就要保证这个指针指向的空间在函数结束以后仍然存在.

        那么这个时候,就可以将空间申请在堆区.然后返回堆区的地址.

 

 

        一定要记得,调用者使用了完之后,记得free

 

 

 3.注意.

 

   1).可以返回局部变量的值.但是不能返回局部变量的地址.

 

   2).如果你非要返回指针,那么就应该把这个空间申请在堆区.

 

 

 

 4. 案例:

 

    1个函数.传入1 1-7的星期数,返回对应的英文星期天.

 

 

    void getWeekDay(int day);

 

 

    1).如果返回值是字符串,那么返回值的类型就写char*

 

    2).直接返回字符串常量.

 

 

 

 5. 申请在常量区的空间.不会被回收的.

    直到程序结束的时候才会回收.

 

 

    不能改:

 

    以字符指针存储在常量区的字符串数据不能改.

 

    其他存储在常量区的数据是可以改的.


2.函数指针

 1.我们之前学习的指针.

   一般情况都是指向另外1个变量.

 

    int num = 10;

    int* p1 = #

 

 

   指针是指向内存中的1个字节空间的.

 

 

 2.程序在运行的时候.会将程序加载到内存.

   程序中主要有代码/指令.

 

   代码段中主要存储程序的代码.而程序的代码就包括函数.

   所以,函数肯定要存在内存的代码段中.

 

   既然函数要存储在内存中那么肯定要用1块空间来存储.

   那么这个块空间一定有1个地址.n

   那么我们就可以声明1个指针,存储这个函数的地址.让这个指针指向这个函数.

 

   使用指针来间接的调用函数.

 

   优势:调用函数有了两种方式.

 

    ->直接使用函数名调用

    ->使用指向函数的指针间接调用.

 

 

 

 3.指向函数的指针的声明

 

    1). 1个指针函数的指针.并不是任意的函数都可以指向.

       而是有限定的.要求指向的函数的返回值类型和参数描述必须要与指针的描述一样.

 

    2).声明语法

    

       返回值类型 (*指针名)([参数列表]);

 

        void (*pFunction)();

 

       表示声明了1个指向函数的指针,名字叫做pFunction.

       这个指针只能指向没有返回值,并且没有参数的函数.

 

 

        int (*pFun)(int num1,int num2);

       表示声明了1个指向函数的指针,名字叫做pFun.

       这个指针只能指向返回值为int类型并且有两个整型的参数的函数.

 

 

 

 4).指向函数的指针的初始化.

 

     1).取到符合指针条件的函数的地址.

 

        函数的名称就代表函数的地址.

 

 

 

     2).将地址赋值给指针变量.

 

        直接将符合条件的函数的名称赋值给这个指针.

 

 

 

 

    3).注意.

 

       函数名代表函数的地址.

       不要函数名加小括弧.如果加了小括弧,就代表执行这个函数拿到这个函数的返回值.

 

 

 

 

 5).如何使用指针来间接的调用指针指向的函数呢?]

 

     void (*pFunc)() = test; //pFunc指针就指向了test函数

        

    pFunc();

 

    (*pFunc)();

 

 

   有参数就给,有返回值就接.

 

 

 

 

 6).小技巧.

 

   如果要定义1个指针指向1个函数

   拷贝这个函数头.删除函数名用小括弧代替里面写上*加指针名称



原创粉丝点击