繁体   English   中英

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

[英]Assign char array to another char array

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

 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

这有效。

任何人都可以请解释为什么?

谢谢!

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

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

array2 = array1;

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

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

这是一个例子:


#include <stdio.h>

int main(){

    char a[] = "hello";

    char *b;

    a = b;

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

    return 0;
}

此代码将输出:

>>> hello 

首先考虑以下代码会更清楚

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 ); 

就像这样:

对于编译器,两者都被视为指针,但不同之处在于:

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

  • char *array2 = ...是一个变量指针,可以指向任何内存点(当然需要许可),

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

所以,对于printf() ,两者都是指针......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM