{int t;
t=x;x=y;y=t;}
main()
{int a=1,b=2;
swap(a,b);
}
上面的程序不能实现变量值交换,是因为swap函数调用时,实参a,b的值分别传递给形参x,y。参与值交换的只是形参x,y,实参a,b的值并没有交换。
void f(int a[])
{int t;
t=a[0];
a[0]=a[2];
a[2]=t;
}
main()
{int b[]={1,2,3};
f(b);
}
上面的程序可以实现数组b的第一个元素和第三个元素交换。
问题是同样是实参往形参传递,按照第一段程序的思路,元素交换不也只是发生在形参数组a中的吗?为什么数组就能在函数调用时不借助指针实现元素值的交换呢?
6 个解决方案
#1
数组传参时,形参实际上退化为指针。
#2
数组做参数时被转化为指向第一个元素的指针
#3
你改的是指针所指的内容而不是参数本身
#4
void f(int*a)//退化为指针.
{int t;
t=a[0];
a[0]=a[2];
a[2]=t;
}
{int t;
t=a[0];
a[0]=a[2];
a[2]=t;
}
#5
c语言中实参的传递都是值传递,即传递参数的时候形参获得的是实参的一个副本,在函数中改变形参的值并不会影响到实参的值。
void swap(int *x,int *y);
{
int t;
t=*x;
*x=*y;
*y=t;
}
函数调用形式为swap(&a, &b);这样能调换a,b的值,
实际上1楼讲到了,数组作为参数时,实际上已经退化为了一个指针,传递过去的是数组的首地址的副本,
在函数中改变数组元素的值如b[3]=3,等价于*(b+3)=3,实际上就是改变了该地址上的内容,因此会影响到数组元素的值.
void swap(int *x,int *y);
{
int t;
t=*x;
*x=*y;
*y=t;
}
函数调用形式为swap(&a, &b);这样能调换a,b的值,
实际上1楼讲到了,数组作为参数时,实际上已经退化为了一个指针,传递过去的是数组的首地址的副本,
在函数中改变数组元素的值如b[3]=3,等价于*(b+3)=3,实际上就是改变了该地址上的内容,因此会影响到数组元素的值.
#6
谢谢各位
#1
数组传参时,形参实际上退化为指针。
#2
数组做参数时被转化为指向第一个元素的指针
#3
你改的是指针所指的内容而不是参数本身
#4
void f(int*a)//退化为指针.
{int t;
t=a[0];
a[0]=a[2];
a[2]=t;
}
{int t;
t=a[0];
a[0]=a[2];
a[2]=t;
}
#5
c语言中实参的传递都是值传递,即传递参数的时候形参获得的是实参的一个副本,在函数中改变形参的值并不会影响到实参的值。
void swap(int *x,int *y);
{
int t;
t=*x;
*x=*y;
*y=t;
}
函数调用形式为swap(&a, &b);这样能调换a,b的值,
实际上1楼讲到了,数组作为参数时,实际上已经退化为了一个指针,传递过去的是数组的首地址的副本,
在函数中改变数组元素的值如b[3]=3,等价于*(b+3)=3,实际上就是改变了该地址上的内容,因此会影响到数组元素的值.
void swap(int *x,int *y);
{
int t;
t=*x;
*x=*y;
*y=t;
}
函数调用形式为swap(&a, &b);这样能调换a,b的值,
实际上1楼讲到了,数组作为参数时,实际上已经退化为了一个指针,传递过去的是数组的首地址的副本,
在函数中改变数组元素的值如b[3]=3,等价于*(b+3)=3,实际上就是改变了该地址上的内容,因此会影响到数组元素的值.
#6
谢谢各位