就我所学的说吧:第五行ChangeData="change"; 是将字符串“change"存放到于ChangeData的值(所指空间的开头地址)为开头的一个空间里:
而在change()函数里,形式参数是指针,所以传的是地址(地址调用),,
在strcpy(changeData,"change")传的也是地址啊,,,因为strcpy()函数原型是
void strcpy(char a[],char b[]),而数组名是个指针,
即于你上面说的其实是:
传值调用只不过是个总称而于啊,,它包括很多什么,传地址,传非数值数据之类的,
,,
请你先看一下语句char *s="ABCDEF"的内部操作过程:
该过程是:在内存里分配一块连续的数据区,并将“ABCDEF”存入这块区域,然后取该区域的首地址(即‘A’所在的地址),并将该地址存入指针变量s中。
从以上过程可以看出,函数
void change(char *ChangeData)
{
ChangeData="change";
}
的执行过程为:
首先变量a的值,也就是“i love china”的地址被赋给ChangeData,此时a和ChangeData指向相同的内存地址,而后,执行ChangeData="change"; 此时ChangeData会指向一个新的内存地址(“change”的地址),而a还是指向“i love china”的地址。所以显然“i love china”不会被改变。
程序的运行的结果:i love china
函数调用的时候是将a的一个值的一个拷贝传过去了,就是在被调用的函数中有一个临时的值,这个值与a的值是相同的,改变这个值是不会影响原来a的值的。
strcpy实际上做拷贝的时候实际上使用的传入参数的地址,也就是说,它把“change”拷贝到了changeData这个参数所指向的地址中。
程序中的代码会将"change"直接写入指针地址
第二种是在内存中先建立一个"change"这样的临时变量,在通过内存复制给ChangeData的地址赋值