关于二级指针的疑问
wmf2014版主以前写过的void f(int **p)
{
int i=10;
*p=&i; //如果这里改为NULL,则会在printf时显示内存不能read
}
void main()
{
int i=5,*p=&i;
f(&p);
printf("%d\n",*p); //这样一来,虽然可以正常显示10,但实际指针p已经是个野指针了
}
要想改变指针变量地址需要二级指针,今天我没事忽然想为什么调用链表插入函数时没用二级指针,这是为什么?
两个指针变量间的赋值是改变地址吧,可形参并不会改变实参的值啊。。。
再看下面这个求多项式和的程序,每次都将新项加入表尾,
void Attach ( int coef,int expon,PtrPoly *PtrRear )就用到了二级指针改变表尾指针的值,以记录更新后表尾的地址。
程序代码:
#include <stdio.h> #include <stdlib.h> typedef struct node PolyNode ; typedef struct node* PtrPoly ; struct node { int coef ; int expon ; struct node* next ; } ; //建立一个不带表头结点的链式多项式 int Compare( int e1,int e2 ) { if(e1>e2) return 2 ; else if(e1<e2) return 1 ; else return 0 ; } PtrPoly Create( int N) { int i ; PtrPoly PtrCurrent,PtrPrevious ; PtrPoly head ; head=NULL; for(i=0 ; i<N ; i++) { PtrCurrent=(PtrPoly)malloc( sizeof(PolyNode) ) ; PtrCurrent->next = NULL ; scanf("%d" , &PtrCurrent->coef) ; scanf("%d" , &PtrCurrent->expon) ; if( head==NULL ) head=PtrCurrent ; else PtrPrevious->next = PtrCurrent ; PtrPrevious = PtrCurrent ; } return head; } void Attach ( int coef,int expon,PtrPoly *PtrRear ) { /*记录尾项位置才能将未处理完的 另一个多项式的项依次复制到结果多项式, 并且每次改变的都是表达式尾项的值,我们需要改变的是结点指针的地址*/ PtrPoly p; p = (struct node*)malloc( sizeof (struct node) ); p->coef = coef ; p->expon = expon ; // 将p指向的新结点插入到当前结果表达式尾项的后面 (*PtrRear)->next = p ; // 修改PtrRear的值 *PtrRear = p ; } PtrPoly Add( PtrPoly p1,PtrPoly p2 ) { PtrPoly front,rear,temp; //为了方便链表插入,先用一个临时空结点作为结果多项式链表表头 rear = ( PtrPoly )malloc( sizeof(PolyNode) ) ; front = rear ; while( p1&&p2 ) { switch ( Compare(p1->expon,p2->expon) ) { case 2 ://e1>e2 Attach( p1->coef , p1->expon , &rear ) ; p1 = p1->next ; break ; case 1 ://e1<e2 Attach( p2->coef , p2->expon , &rear ) ; p2 = p2->next ; break ; case 0 : if( (p1->coef + p2->coef) != 0 ) Attach((p1->coef+p2->coef) , p1->expon , &rear ) ; p1 = p1->next ; p2 = p2->next ; break ; } } for( ; p1 ; p1=p1->next) Attach( p1->coef , p1->expon , &rear ) ; for( ; p2 ; p2=p2->next) Attach( p2->coef , p2->expon , &rear ) ; rear->next = NULL ; temp = front ; front = front->next ; //链表头结点为空,指向下一个结点即指向结果多项式第一个非0项 free( temp ) ; return front ; }