C++ 将字符数组分配给另一个字符数组

C++ 将字符数组分配给另一个字符数组,c++,c,arrays,C++,C,Arrays,我知道我们不能将一个字符数组分配给另一个字符数组,如: char array1[] = "Hello"; char array2[] = "Hi!"; array1 = array2;//does not compile 但是: 这很有效 谁能解释一下原因吗 谢谢 普通数组是不可分配的。这就是第一个代码示例不起作用的原因 在第二个示例中,array2只是一个指针,而array1尽管是一个数组,但在某些情况下可能会衰减为指向其第一个元素的指针。这就是这里发生的事情: array2 = a

我知道我们不能将一个字符数组分配给另一个字符数组,如:

 char array1[] = "Hello";
 char array2[] = "Hi!";

 array1 = array2;//does not compile
但是:

这很有效

谁能解释一下原因吗


谢谢

普通数组是不可分配的。这就是第一个代码示例不起作用的原因

在第二个示例中,
array2
只是一个指针,而
array1
尽管是一个数组,但在某些情况下可能会衰减为指向其第一个元素的指针。这就是这里发生的事情:

array2 = array1;

在此赋值之后,指针
array2
指向数组
array1
的第一个元素。没有数组赋值,而是指针赋值。

,更清楚地考虑下面的代码

char *p = ( char * ) malloc( 6 * sizeof( char ) );
实际上,您动态地分配了一个包含6个元素的未命名字符数组,并将数组的第一个元素的地址分配给指针p。现在您可以使用该指针访问数组的任何元素。比如说

p[0] = 'H';
p[1] - 'e';
p[3] = 'l';
p[4] = 'l';
p[5] = 'o';
p[6] = '\0';

printf( "%s\n", p );
这一点仅对代码段有效,而不是对未命名数组和函数malloc返回的地址有效。您使用的现有数组的名称与指向数组第一个元素的指针的调整方式相同

char array1[] = "Hello";
char *array2;

array2 = array1; 

printf( "%s\n", array2 ); 
因此数组本身不会被复制。您只引入了指向其第一个元素的指针。使用此指针可以访问数组的任何元素。因为它指向阵列占用的内存区域

如果要创建数组的副本,应编写

#include <string.h>

//...

char array1[] = "Hello";
char array2[sizeof( array1 )];

strcpy( array2, array1 ); 
#包括
//...
字符数组1[]=“你好”;
char array2[sizeof(array1)];
strcpy(array2,array1);
是这样的:

对于编译器,两者都被视为指针,但区别在于:

  • chararray1[]={…}
    是指向固定内存区域的指针(在本例中,它位于堆栈中)

  • char*array2=…
    是一个变量指针,可以指向内存中的任何一点(当然有权限)

在第一种情况下,编译器甚至知道数组的大小,而在第二种情况下,编译器只知道它是指针,因此它无法知道它所指向的数组的大小


因此,对于
printf()
,两者都是指针…

char array1[]
它基本上是指向char数组的de第一个字母的指针。您可以将此地址分配给另一个指针变量

以下是一个例子:


#包括
int main(){
字符a[]=“你好”;
char*b;
a=b;
printf(“%s\n”,a);
返回0;
}
此代码将输出:

你好
我不会说两者都被视为指针。只有当你开始访问数组的元素时,你才开始处理指针。。。。但是它们之间有什么区别呢?第一种情况编译器有更多信息。。。我看不出还有什么不同。。。我没有正式的答案。这只是一个观点……当你想在这个StackExchange(特别是C)上讨论指针时,首先,想想迂腐、精确、特殊、挑剔、痛苦、回报这些词。(还有很多其他的)。然后决定你是否会加入这场争斗。当你做出一个不完全基于一套迂腐的规则的特殊陈述时,会有人来把它拆开。这有时是痛苦的,但如果你愿意学习,从长远来看应该会有回报。。。你说得对。。。但是为什么数组不能被视为指针呢?除了赋值和
sizeof()
operation…@瓦格纳帕特里奥塔:我想你在评论中回答了你自己的问题。
sizeof(char)<代码> > 1 < /COD>。@ Carl Norum,你想说什么?你可能想提及const和StrucPy来完成。边注:我总是觉得C++是一个更整洁的语言,如果数组被当作一流的对象对待。也就是说,如果为数组定义了像
[]
=
这样的运算符(而不需要数组到指针的转换)。这将是很好的和统一的。谢谢你!现在我明白了。
#include <string.h>

//...

char array1[] = "Hello";
char array2[sizeof( array1 )];

strcpy( array2, array1 );