pigyuneverland 2015-10-06 16:10 采纳率: 50%
浏览 1730
已采纳

求问一个C语言字符指针的问题

#include
void Initialize (char * a, char * b) {
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;
b[8] = 'B';
}

#define ARRAY_SIZE 10
char a[ARRAY_SIZE];
char b[ARRAY_SIZE];
int main(int argc, char * argv[]) {
Initialize(a, b);
printf("%s\n\n%s\n", a, b);
return 0;
}

图片说明

为什么会得到这样的输出呢?

  • 写回答

7条回答 默认 最新

  • 青焰阁主 2015-10-07 00:27
    关注

    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;
    }

    还有不明白的么?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料