函数指针与指针间的运算

 

参考资料: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;    

 



 

posted on 2014-05-04 15:51  zhuxuekui3  阅读(307)  评论(0编辑  收藏  举报