• 函数指针与指针间的运算


    参考资料:http://blog.csdn.net/vlily/article/details/7244682   函数指针作为某个函数的参数及定义函数指针

                  http://blog.csdn.net/qll125596718/article/details/6891881   typedef函数指针用法

                  

    typedef int (*fp)(int,int); //这样只是定义一个函数指针类型
    int add(int a,int b)
    {
        return a+b;
    }
    
    int main()
    {
        /************************************************************************/
        /* 用一个指针指向另一个指针,其中一个指针在变,另一个指针不变。我们指向的是一个确定
           的常量,常量的地址不变,那么另一个指针就不会变,而操作的指针他的值是在变的,但
           并不影响另一个指针。仅仅是指向,指针无法指向一个变量,是一个常量。切记!切记!
        /************************************************************************/
        //int *p,*q;
        //int i,j;
        //i = 2;
        //p = &i;
        //q = p;
        //i = 3;
        //j = 4;
        //p = &j;
        //cout << &p << "  "<< &q <<endl;    
    
        /************************************************************************/
        /* 函数指针的用法                                                       */
        /************************************************************************/
        fp fpadd; //然后用FunType类型来申明FunP变量,就跟原子类型一样,这样我们就可以使用了
                  //这是一个局部的函数指针变量,当然也可以是全局的函数指针变量。
        fpadd = add;//将fpadd指向add函数,这里写&add也是对的,将add函数的地址赋给fpadd函数指针
        int sum = fpadd(2,3);//用fpadd来替代add指向操作
        cout << sum << endl;
    return 0;
    }


    //下面语句是提取相同的元素到La中去,不是求并集,切记。
    void union1(SqList &La, SqList &Lb)
    {
       ElemType *q1 = &(La.elem[0]);
       ElemType *p1 = &(La.elem[La.length-1]);
       
       ElemType *q2 = &(Lb.elem[0]);
       ElemType *p2 = &(Lb.elem[Lb.length-1]);
       ElemType *temp = q2; //这里面是用的常量在初始化,并不是用变量在初始化指针。
    
       int count = 1; 
       /*下面的语句,用&(La.elem[La.length-1]),不可用p1,p1是不变的,而我们插入的话
         La是在变动的,所以不可以用一个不变的东西去代替。但p2是不变的,无所谓。
       */
       for(q1; q1<= &(La.elem[La.length-1]); ++q1)  //控制次数
       {       
           for (q2;q2<=p2;++q2)
           {
               if (*q1==*q2)
               {
                  ListInsert_Sq(La,count,*q1);
                  ++q1;     //注意:La是在变动的。
                  ++count; //严格控制插入的位置,La在变,指针位置相对的移动一个位置,所以
                          //与La相关的count也是需要变动的。
               }
           }
           q2 = temp;  //一定要知道指针这个东西是如何变动的。什么时候移动了,什么时候就没移动。等等。
           ++count;
       }
    }
    //在线性表中插入元素
    Status ListInsert(LinkList &L,int i,ElemType e)
    {
        //在带头结点的单链线性表L中第i个位置之前插入元素e
        LinkList p = NULL;
        LinkList s = NULL;
        p = L;
        int j = 0;
        while (p && j < i - 1)  
        {
            p = p ->next;
            ++j;
        }
        if (!p || j > i - 1)
        {
            return ERROR;
        }
        s = new LNode;
        s -> data = e;
        s -> next = p->next;
        p -> next = s;
        return OK;
    }

      上面的程序要和上面的以及下面的区别开来:

      在1中,temp指向的是一个确定的地址空间,他不会随着q2的改变而改变。且其地址不一样。

      在2中,P = L ,P的改变必然伴随着L的改变,这个是一体的。P是由L开辟出来的。两者同身共死。delete(P);L也将消失,且P就是L的一个孪生兄弟,连地址都一样。

    /************************************************************************/
        /* 用一个指针指向另一个指针,其中一个指针在变,另一个指针不变。我们指向的是一个确定
           的常量,常量的地址不变,那么另一个指针就不会变,而操作的指针他的值是在变的,但
           并不影响另一个指针。仅仅是指向,指针无法指向一个变量,是一个常量。切记!切记!
        /************************************************************************/
        //int *p,*q;
        //int i,j;
        //i = 2;
        //p = &i;
        //q = p;
        //i = 3;
        //j = 4;
        //p = &j;
        //cout << &p << "  "<< &q <<endl;    


  • 相关阅读:
    网游开发中的可怕群体:单机派
    关卡设计的基本理论
    游戏程序员所需的知识体系
    关于SQL Server将一列的多行内容拼接成一行的问题讨论——之一(转)
    c# lmada 修改List内容
    c# 取sqlite库分组的第一行不对
    关于SQL Server将一列的多行内容拼接成一行的问题讨论(转)
    “打包的”爱情
    “婚礼哥”隔空喊爱:我要做你一生的北京情人
    北漂,都不敢奢望爱情?
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3707225.html
Copyright © 2020-2023  润新知