C++ 为何会改变行参的值?!

flyxx 2009-02-10 12:24:52
template <class T>
T a(T x[])
{
for(int i = 0; i<10; i++)
{
x[i]=0;
cout << x[i] << endl;
}
}
int main()
{
int *x = new int[10];
int y[10];
for(int i = 0; i<10; i++)
{
y[i] = i;
x[i] = i;
cout << "++++ x[i]=" << x[i] << " y[i]=" << y[i] << endl;
}
a(x);
a(y);

for(int i = 0; i<10; i++)
{
cout << "---- x[i]=" << x[i] << " y[i]=" << y[i] << endl;
}

cout << "测试完毕!任意键继续...." << endl;
cin.peek();
return 0;
}



---------------
运行结果:
++++ x[i]=0 y[i]=0
++++ x[i]=1 y[i]=1
++++ x[i]=2 y[i]=2
++++ x[i]=3 y[i]=3
++++ x[i]=4 y[i]=4
++++ x[i]=5 y[i]=5
++++ x[i]=6 y[i]=6
++++ x[i]=7 y[i]=7
++++ x[i]=8 y[i]=8
++++ x[i]=9 y[i]=9
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
---- x[i]=0 y[i]=0
测试完毕!任意键继续....

为什么函数a()把main函数的两个数组做为行参传递给a(),结果都被a()修改了?!
...全文
129 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqz981 2009-02-10
  • 打赏
  • 举报
回复
你a函数传递的x y 都是地址, 当然直接就修改的所在地址内部了值了。
如果你传递的是值 比如 a(int x) 就另当别论了。
ribut9225 2009-02-10
  • 打赏
  • 举报
回复
呵呵
楼上各位都说了,数组在做函数参数的时候,是传递数据的首地址,当指针用的
sagegz 2009-02-10
  • 打赏
  • 举报
回复
当然一般情况下参数不需要修改都会在参数类型前加上const
sagegz 2009-02-10
  • 打赏
  • 举报
回复
参数为引用或者指针,可以看错是间接对参数进行了修改.
zinoR1 2009-02-10
  • 打赏
  • 举报
回复
数组是特殊的指针
xuedaoli 2009-02-10
  • 打赏
  • 举报
回复
数组退化为指针
scott_2009 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 waizqfor 的回复:]
引用楼主 flyxx 的帖子:
template <class T>
T a(T x[])
{
for(int i = 0; i <10; i++)
{
x[i]=0;
cout < < x[i] < < endl;
}
}
int main()
{
int *x = new int[10];
int y[10];
for(int i = 0; i <10; i++)
{
y[i] = i;
x[i] = i;
cout < < "++++ x[i]=" < < x[i] < < " y[i]=" < < y[i] < < endl;
}
a(x…
[/Quote]
我记得好象是如果参数是引用则不退化,如果是值传递则退化为指针。
cppfaq 2009-02-10
  • 打赏
  • 举报
回复
No matter how we define an array, there is always a fundamental relationship between arrays and pointers: Whenever we use the name of an array as a value, that name represents a pointer to the initial element of the array.
lzh9955 2009-02-10
  • 打赏
  • 举报
回复
up
blingpro 2009-02-10
  • 打赏
  • 举报
回复
关于传值 & “传址”
OenAuth.Net 2009-02-10
  • 打赏
  • 举报
回复
数组退化成指针
weigangme 2009-02-10
  • 打赏
  • 举报
回复
指针
waizqfor 2009-02-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 flyxx 的帖子:]
template <class T>
T a(T x[])
{
for(int i = 0; i <10; i++)
{
x[i]=0;
cout < < x[i] < < endl;
}
}
int main()
{
int *x = new int[10];
int y[10];
for(int i = 0; i <10; i++)
{
y[i] = i;
x[i] = i;
cout < < "++++ x[i]=" < < x[i] < < " y[i]=" < < y[i] < < endl;
}
a(x);
a(y);

f…
[/Quote]
数组在作为形参被使用的时候 数组名退化为指针去使用!~

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧