将char数组分配给另一个char数组

时间:2014-07-28 22:45:41

标签: c++ c arrays

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

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

 array1 = array2;//does not compile

可是:

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

 array2 = array1; //compile

 printf("%s", array2); //display Hello

这很有效。

任何人都可以解释原因吗?

谢谢!

4 个答案:

答案 0 :(得分:5)

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

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

array2 = array1;

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

答案 1 :(得分:1)

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

这是一个示例:


#include <stdio.h>

int main(){

    char a[] = "hello";

    char *b;

    a = b;

    printf("%s\n", a);

    return 0;
}

此代码将输出:

>>> hello 

答案 2 :(得分:0)

首先考虑下面的代码

会更清楚
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 ); 

答案 3 :(得分:-1)

它是这样的:

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

  • char array1[] = {...}是一个 FIXED 指针,指向固定的内存区域(在这种情况下,它位于堆栈中)

  • char *array2 = ...是一个可以指向任何内存点的变量指针(当然是在获得许可的情况下),

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

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