C++问题(含代码)

来源:百度知道 编辑:UC知道 时间:2024/07/04 13:48:44
int a(char *a)
{
a="123";

}

int main(int argc, char *argv[])
{
char b[]="111";
a(b);
cout<<b;

system("PAUSE");
return EXIT_SUCCESS;
}

为何输出的是111而不是123?

int a(char *a) // a形参

a(b); // 只是把b的地址传给了a

a="123" // 实际上是,在系统中重新创建了一个"123"对象,然后把这个对象的地址付给了a,而b所指的地址并没有变化,还是指向“111”这个空间。

哦,才发现问题其实很简单,你应该知道
char * s="zifuchuan"
这种形式是定义静态字符串吧,也就是在静态stack中分配内存给char *,这就导致了函数内部的b已经不再指向和外面的b同一个地址了。
你可以把地址转换成整型打印出来看看,如下
int a(char *a)
{
cout<<"Before:"<<(long)a;
a="123";
cout<<"After:"<<(long)a;
}
可以看到指针值的变化。

b[] 使得 b 的值是一个常值, 不可更改,
int a(char *a) 的定义中, 形参指针变量 a, 也只会接受按值传送的实参, a="123"; 也只是更改形参身的值, 而不会对实参有任何影响, cout<<b; 始终是输出 b[] 对应的字符串值.
根本不存在什么策略问题,
数组一经定义, 数组名就是一个常值, 把这点搞清楚. 另外不要认为有指针就是把实参完全传送给形参, 这里的方式不可能对实参的值(地址)有任何改变, 如果试图改变数组名常值的话,也只会造成 运行时错误.

楼上的各位怎么搞的(除了 tk999999 外),
数组名 b 是常值, 是不可改变的, 函数 int a 的内部实现无论是怎么样的, 都是不可能改变 b 的值(地址意义上的)的.
cout<<b; 也只能输出 b 数组对应的字符串 "123" (这个串值也没改变, 当然是可以改变的).

这是一个非常关键的问题,你们怎么都 没意识到或