易错点:函数使用指针进行值的交换

结论:函数的参数是指针变量时,在函数体中,指针变量指向的地址改变,但是指针变量指向的地址空间内的值不变,因此,主函数中的指针变量的值保持不变

实际上,

实参传入的是(&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);
} 

总结:

对于通过函数的新参进行赋值,应当对指针指向的内存(值)进行赋值操作,而不是对指向进行操作,否则只是地址变量改变,但指向的内存不变,值还是原来的那个值。

只是改变了形参的指针指向,并未对指向的内存空间进行(实参的)值的改变

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值