void Initialize (char * a, char * b) {
// 在进入这个函数后,传递过来的a,b,被你现在定义的a,b所接受
// 但是我觉得你的这两个形参名用得不好,你先前定义的是全局变量a, b,现在形参名又是a,b
// 对于本段代码而言还好些,如果你写的是另外一种函数声明和实现方式,估计要出问题
// 下面这段代码是把a这个数组设置内容,根据下标一一设定
a[0] = 'T'; a[1] = 'h'; a[2] = 'i';
a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's';
a[7] = ' '; a[8] = 'A'; a[9] = '\0';
// 而b=a,表示把a的首地址,赋值给b(b一开始存的是b自己那片空间的首地址)
// 现在相当于,a 和 b同时存放的是a数组的首地址,那么它们内部的内容是相同的,都是你上面一一赋值的那些内容
b = a;
// 现在,你把b[8] = ‘B’;
// 说明你修改了b所指向的空间的内容,而b和a又是同时指向同一个空间,所以相当于a,b同时被修改
b[8] = 'B';
// 函数结束,返回main函数
// 但是要注意,在本函数里面的a,b 都是指定义的形参,而不是全局变量a,b
// 所以,函数的最开始,形参a = 全局a, 形参b = 全局b;
// 然后,你对形参a进行赋值操作,相当于改变全局a 的内容,
// 紧接着,你把形参b = 形参a,此时表示,形参a, 形参b,全局a都是指向全局a这块空间的
// 然后,你对形参b进行修改,表示你同时修改了这三个。
}
#define ARRAY_SIZE 10
char a[ARRAY_SIZE];
char b[ARRAY_SIZE];
// 程序从mian函数开始执行,但是,宏定义和全局变量会预先编译好
int main(int argc, char * argv[]) {
// Initialize(a,b) 这句表示调用Initialize函数,并且将字符数组a,b作为参数传递过去。
// 此时问题就来了,事实上,数组的名字(就是,a,b),表示的是数组的首地址,也就是数组的第一个元素的地址。
// 此时程序进入Initialize函数内部
Initialize(a, b);
// 所以,到这行时,表示全局a的内容曾经被修改,而全局b还是空内容
printf("%s\n\n%s\n", a, b);
// 控制台输出:This is B
return 0;
}
还有不明白的么?