第二种是对指针进行的操作。
把指针看成变量的话,无论子函数对指针如何改变,主函数里指针所指向的地址都不会改变。
而第一种则是对指针所指向地址的内容进行改变,这个是永久的。
这需要说明的是,当对非指针类型的变量进行操作的时候,实际的操作区域是在RAM中,是将a这个值复制到RAM中。而对指针变量进行操作是,如*p,是将p的地址0x1000,复制到RAM中,但是当对p所指内容进行操作时,就不是在RAM中了,而是在0x1000那边了。
当子函数退出之后RAM区清空,a当然不会改变,但是*p所指的内容就会有改变了。
不知我有没说清楚,如果还不明白请发站内信
呵呵,这就是初学者学习指针时容易犯的错误,第二个程序的企图是想直接改变指针的地址来改变a,b,c的值,但这样是不可能做到的,因为在C语言中实参变量(比如此题的main函数中exchange(p1,p2,p3);的p1,p2,p3为实参变量)和形参变量(比如此题的exchange(int *q1,int *q2,int *q3)
中的*p1,*p2,*p3为形参变量)之间的数据传递是单向的“值传递”方式。指针变量作为函数参数也要遵循这一规则。调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值(比如此题中a,b,c的值)。
所以
temp=*pt1;
*pt1=*pt2;
*pt2=temp;
改变的就是指针所指变量的值,实参指针此时的值是没有变的,而
temp=pt1;
pt1=pt2;
pt2=temp;
根本没有改变到指针所指变量的值,实参指针此时的值也是没有变的。
一句话就是实参指针的值一直都不会变,它只能改变到它所指的变量的值。
第二中写法
void swap(int *pt1, int *pt2)
{
int *temp;
temp = pt1;
pt1 = pt2;
pt2 = temp;
}
只是改变了pt1 pt2两个指针所指的位置,没有改变他们所指的内容。
在调用swap(q1, q2)这个函数时,首先做的是复制参数,可以理解为
pt1 = q1; pt2 = q2; 这样 无论怎么改变pt1 pt2他们指针的位置 也不会影响到q1 q2。