函数指针与指针间的运算
参考资料: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;