void swap(int *pt1,int *pt2)
{
int i;
i=*pt1;
*pt1=*pt2;
*pt2=i;
}
void exchange(int *q1,int *q2,int *q3)
{
if(*q1<*q2)
swap(q1,q2);
if(*q1<*q3)
swap(q1, q3);
if(*q2<*q3)
swap(q2, q3);
}
void main()
{
int a,b,c;
int*p1,*p2,*p3;
p1=&a;
p2=&b;
p3=&c;
*p1=3;
*p2=6;
*p3=9;
exchange(p1, p2, p3);
printf("a=%d,b=%d,c=%d",a,b,c);
}
注意:实参传入指针的话,形参指针指向改变,不影响原形参指向的变量的值
void exchange(int *q1)
{
int i=19;
q1=&i; 形参q1指向改变,不影响主函数中a的值,很简单
//*q1=100; //将100传递给q1,接口传递回主函数,a的值得以改变
}
void main()
{
int a;
int*p1;
p1=&a;
*p1=3; //给a赋值3;
exchange(p1); 指针做实参传入
printf("%d",a);
}
另外二维指针传递指针的地址
void exchange(int **q1)
{
static int i=19;
int *p=&i;
*q1=p; //改变了main函数中指针的地址 如果改成q1=&p;则main函数中,指针的地址不会改变,
因为只是二级指针的指向改变,不会影响到1级指针。技巧,只要等号左边形参无*,都不会引起main函数变量的变化(见上面红的方块)
printf("pppppp:%p\n",p); //pppppp:0xbfffd9dc
printf("pppppp:%d\n",*p); //pppppp:19
}
void main()
{
int a;
int*p1;
p1=&a;
*p1=3;
printf("%p\n",p1); //0xbfffda30
exchange(&p1);
printf("%p\n",p1); //0xbfffd9dc
printf("%d\n",a);
printf("%d",*p1); //-1073751564 为什么是乱值?原因是exchange函数中的变量i,在出函数内存就被释放了,指向该地址的p1指针显示的是无效内容。
}
解决办法:
void exchange(int **q1)
{
static int i=19; 添加static后函数结束,地址不会被回收
int *p=&i;
*q1=p;
printf("pppppp:%p\n",p);
printf("pppppp:%d\n",*p);
}