我知道我们不能将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
这很有效。
任何人都可以解释原因吗?
谢谢!
答案 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()
,两者都是指针......