关于二级指针的疑问
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 ;
}




