c指針深入理解--指針和函數

一、程序的栈和堆:

  堆:

    -》栈

      -》程序栈

        -》栈幀(组织)

          -》函数返回地址

          -》局部数据存储

          -》参数存储

          -》栈指针和基指针

            1)栈指针:通常指向栈顶部

            2)基指针:通常指向帧栈内部地址,比如函数返回地址、数组

 

    -》?動態堆(自定義申請)

 

二、通過指針傳遞和返回數據:

    -》传递数据:

      1)指针传递

        void swapWithPointers(int* pnum1, int* pnum2) {

          int tmp;
          tmp = *pnum1;
          *pnum1 = *pnum2;
          *pnum2 = tmp;
        }
        下面的代码段说明了这个函数的用法:
        int main() {
          int n1 = 5;
          int n2 = 10;
          swapWithPointers(&n1, &n2);
          return 0;
        }

      2)数值传递:(普通传参方式)

 

      3)传递指向常量的指针:(这种方式效率很高,因为只传了数据的地址,能避免某些情况下复制大量内存)

 

       -》返回数据:

 

三、函數指針:

  概念区别:

    函数指针:强调的是指针,如 int (*fun)()

    指针函数:强调的是函数,如 int *fun()

  -》传递函数指针:

      例子:

        int (*func)( int num,int num2){};

        int add( int num,int num2){};

        int sub( int num,int num2){};

        void op( func operation,int num,int num2 );

      调用:

        op( add, 2,3);

    

  -》返回函数指针:

      例子:

        int (*func)( int num,int num2){};

        int add( int num,int num2){};

        int sub( int num,int num2){};

        func select( char opcode);

          switch(opcode) {

          case '+':return add;
          case '-':return subtract;
        }

      调用:

        func op = select( add);

        op( int num,int num2);

  -》使用函数指针数组

      例子:

        typedef int (*fptrOperation)(int,int);

        int add( int num,int num2){};

        int sub( int num,int num2){};

        typedef  int (*func[128])( int num,int num2){};

        void arr(){

          func['+'] = add;

          func['-'] = sub;

        };

        int evaluateArray(char opcode, int num1, int num2) {

          fptrOperation operation;
          operation = func[opcode];
          return operation(num1, num2);
        }

      调用:

        arr();

        evaluateArray('+',5,6) ;

  

posted @ 2021-12-24 11:57  dcli  阅读(78)  评论(0)    收藏  举报