结论:函数的参数是指针变量时,在函数体中,指针变量指向的地址改变,但是指针变量指向的地址空间内的值不变,因此,主函数中的指针变量的值保持不变
实际上,
实参传入的是(&a,&b),都是地址常量。
但是函数的形参是指针(*a,*b),都是地址变量(指针)
在函数中交换形参的指向,并没有改变实参a,b的地址,实际上也不能改变这些地址常量,说到底只是改变了形参的指针指向,并未对指向的内存空间进行(实参的)值的改变
//交换a,b(错误示例)
void func(int *a,int *b) {
int *x;
x=a;
a=b;
b=x;
}
int main() {
int a=1,b=2;
func(&a,&b);
printf("a=%d,b=%d",a,b);
}
//运行结果:a=1,b=2
这个例子中,函数中,只是形参指针改变了指向,但实参a,b的值并没有改变
能使a,b的值改变的,只有实际的值交换,对形参指针指向的内存空间*a,*b进行值的交换:
void func(int *a,int *b) {
int x;
x=*a;
*a=*b;
*b=x;
}
int main() {
int a=1,b=2;
func(&a,&b);
printf("a=%d,b=%d",a,b);
}
//运行结果:a=2,b=1
类似的,对地址q进行内存空间(值)的改变,而不是地址的(指向)改变,才可实现赋值
其中,数组a的生存期是到程序结束,在程序运行期间,数组a一直不会被释放。同样不会释放的,还有指针(本质是地址值不会释放)
void func(char q[])
{
char a[]="hello";
strcpy(q,a);
// q=a;无效赋值
}
void main()
{
char p[10];
func(p);
printf("%s\n",p);
}
总结:
对于通过函数的新参进行赋值,应当对指针指向的内存(值)进行赋值操作,而不是对指向进行操作,否则只是地址变量改变,但指向的内存不变,值还是原来的那个值。
只是改变了形参的指针指向,并未对指向的内存空间进行(实参的)值的改变