函数参数传递方式

函数参数传递方式,常常让人产生误解。先看一个简单的例子。
#include <stdio.h>
void change(char *a);
void change_char(char *a);
int main(){ 
    
char a[]="abcdefg";
    printf(
"before %s\n",a);

 

     change(a);
      printf(
"after %s\n",a);

      change_char(a);
      printf(
"after change char 'b',a is %s\n",a);

  return 0;
}

void change(char *a)
{
  a
++; //改变了指针形参的大小哦
}

void change_char(char *a){
        a++; //改变了指针形参的大小哦
        *a='B'; }
例子中的change函数,对指针形参a进行了改变,按我以前的理解,这意味着指针将指向字符串“abcdefg”中的第二个字母‘b',printf输出应该是”bcdefg“。实际上,main函数中a的大小原封未动。运行结果如下:
before abcdefg
after abcdefg
after change char 'b',a is aBcdefg

 事实胜于雄辩,我的理解显然有误。

  在《c和指针》一书中提到,c函数的所有参数均以“传值调用“方式进行传递。参数(指针)实际上是一份拷贝,但在这份拷贝上执行间接访问操作所访问的是原先的数组。对指针形参执行间接访问操作,就是对指针所指向的内存位置上的内容进行修改。不管是”按值传递“还是”按地址传递“,其作用原理都是先拷贝,后操作。在上例中,a++表达式,将使得a的拷贝值加1,但是a的原始值不变。而*a操作,因为指针的特殊性,指向了另一个地址,操作指针参数的拷贝,即操作另一个地址上的内容,也就是将‘b'修改成’B‘

  上述解释有点绕,再来看看《c和指针》书上的两个例子,它们非常清楚的说明了一点:c函数的所有参数均以”传值调用“方式进行传递,也就是拷贝实参的方式

/*交换调用程序中的两个整数(没有效果)*/

void swap(int x,int y){
    int temp;    
    
    temp=x;
    x=y;
    y=temp;
}


/* 有效果,成功交换调用程序中的两个整数*/

void swap(int *x,int *y){
    int temp;
    
    temp=*x;
    *x=*y;
    *y=temp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值