Pigyu0822
pigyuneverland
2015-10-06 16:10
采纳率: 50%
浏览 1.7k
已采纳

求问一个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条回答 默认 最新

  • s951127937
    青焰阁主 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;
    }

    还有不明白的么?

    点赞 评论
  • xiangzi0037
    xiangzi0037 2015-10-06 16:17

    char *b默认指向数组b的一个拷贝

    点赞 评论
  • qq_29389535
    qq_29389535 2015-10-06 16:52

    b是一个引用,a是地址,所以是b引用a,两个共用同一个地址,当改变b的值也就改变a值

    点赞 评论
  • tinysail
    tinysail 2015-10-06 19:01

    这个是关于局部变量和指针的问题,数组的名称其实代表数组的地址,当把全局数组a和b作为实参传递给函数时,也就相当于把两个数组的地址分别赋值给了函数里面的形参a和b。所以在函数中通过a[x]可以给全局数组a赋值,当执行b=a时,相当于把全局数组a的地址赋值给了b(注意,仅仅是改变了函数中b的值,并没有改变全局数组b的值) 所以b[8]可以改变全局数组a[8]的值。在函数中并没有在传进来的全局数组b的地址上做任何的改变,所以打印出来b为空。

    点赞 评论
  • tinysail
    tinysail 2015-10-06 19:06

    可以在main中Initislize那一行或者前面打个断点,然后step into那个Initialize函数,跟踪main中a和b的值和Initialize函数里面a和b的值(均为指针类型的)

    点赞 评论
  • xujizhe813
    徐喆 2015-10-07 00:07

    b和a指的是同一块内存地址

    点赞 评论
  • ypxu1990
    ypxu1990 2015-10-07 01:36

    你好好看看, Initialize方法中的b是一个指针,指向了a的地址,所以修改b[8]是有数据的。Main函数中的b也是一个指针,但是它指向的不是a的那块地址啊,它自己分配了一块内存,这块内存都没进行过赋值,所以输出为空咯。

    点赞 评论

相关推荐