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 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题