C 更改指针数组的内容

C 更改指针数组的内容,c,arrays,pointers,C,Arrays,Pointers,这看起来应该很容易,但我花了太多时间在上面。希望有人能帮忙 char *labels[] = { "apple", "orange" }; // each items inside label is string literal. We can't change them- 看看下面的图片 char a[]="hi"; char b[]="hello"; char *name[]={a,b};//each item inside name is not string literal rite?

这看起来应该很容易,但我花了太多时间在上面。希望有人能帮忙

char *labels[] = { "apple", "orange" }; // each items inside label is string literal. We can't change them-
看看下面的图片

char a[]="hi";
char b[]="hello";
char *name[]={a,b};//each item inside name is not string literal rite??
*name="bye";
puts(a);
我认为输出将是
bye
,因为我使用
*name=“bye”


但是输出仍然是
hi
。为什么?

char*name[]={a,b}//名称中的每个项目都不是字符串-不完全是,每个元素都是指向
字符的指针

因此,
name
是一个指针数组
*name=“bye”
更改第一个指针更改为的内容。它不会改变旧指针指向的内存

如果您想这样做,您通常会使用
strncpy
,但请注意,这里没有足够大的数组来实现这一点

(我还希望您的编译器在为
*name=“bye”
char*
分配
const char*
时给您一个警告。)

*name=“bye”
之前:

*name=“bye”
之后:


字符*名称[]={a,b}//名称中的每个项目都不是字符串-不完全是,每个元素都是指向
字符的指针

因此,
name
是一个指针数组
*name=“bye”
更改第一个指针更改为的内容。它不会改变旧指针指向的内存

如果您想这样做,您通常会使用
strncpy
,但请注意,这里没有足够大的数组来实现这一点

(我还希望您的编译器在为
*name=“bye”
char*
分配
const char*
时给您一个警告。)

*name=“bye”
之前:

*name=“bye”
之后:


调试时,我发现您所说的正在发生。但是
*name
的地址是
a[]
rite?对
*名称的任何修改都必须反映在
a[]
rite?中?。没有,我没有收到任何警告
*name
仍然是一个指针,指向
a
*name
更改指针指向的对象。因此,既然*name已更改为指向其他对象,那么查找b并期望它是“hello”并不是真正有效的,对吗?
b
一点也没有更改。它仍然有效,它仍然由
name
的第二个元素指向。感谢您的解释。你能解释一下为什么这不起作用吗?当我调试时,我发现你说的事情正在发生。但是
*name
的地址是
a[]
rite?对
*名称的任何修改都必须反映在
a[]
rite?中?。没有,我没有收到任何警告
*name
仍然是一个指针,指向
a
*name
更改指针指向的对象。因此,既然*name已更改为指向其他对象,那么查找b并期望它是“hello”并不是真正有效的,对吗?
b
一点也没有更改。它仍然有效,它仍然由
name
的第二个元素指向。感谢您的解释。你能解释一下为什么这不起作用吗