在C中创建字符串的方法有什么区别?

C语言中这两种forms的字符串变量有什么区别?

char *string1; char string2[]; 

还有其他办法吗?

非常感谢你。

char *string1 = "foo";

string1是指向字符串文字的指针(为了参数,它指向存储在程序的只读数据段中的一系列字符)。

char string2[] = "foo";

string2是一个包含4个字符的数组。 它用字节’f’,’o’,’o’,ASCII_NUL初始化。

可能最显着的区别是,如果你做string1[0] = 'b'; 你得到未定义的行为,因为你试图修改存储的表示forms的字符串文字。 如果你做string2[0] = 'b'; 然后你将你的个人字符串修改为“boo”,这很好。

通常, char*类型的变量是指向char的指针。 它通常用于指向NUL终止的字符序列中的第一个字符,在这种情况下,它指向一个字符串。 char[]类型的变量是一个chars数组。 如果它有一个NUL终结符,那么它实际上是一个字符串。

这个问题稍微被两个事实搞糊涂了:

1)在C中,每当在带有指针的上下文中使用数组变量名时,它“意味着”指向数组的第一个元素的指针。 因此,数组和指针通常被认为是可互换的。

2)在C中, char[]类型的函数参数实际上不是数组。 它只是一个指针,与char*完全相同。 因此,数组和指针通常被认为是可互换的。

那么,指针和数组之间的另一个区别是:

 string1 = "bar"; // changes string1 to point to another string literal. string1 = string2; // changes string1 to point to the first character of string2. string2 = string1; // doesn't compile - you can't assign to an array, // only initialize it and then modify element-by-element. 

[注意:声明char string2[]; 在问题中,函数中的C语法无效,但我使用的定义在函数或文件范围内,在任何函数之外都是有效的。 无论哪种方式,它们的行为与我所描述的初始化和赋值一样,但它们的生命周期不同。]

它们在内部表示方式上有所不同,但与程序员的工作方式几乎相似。

char string2[]; 是一个字符数组,当直接分配时,编译器将理解它是一个字符集合,使得sizeof()返回数组的大小(而不是字符串)。

char *string1是指向字符串中第一个字符的指针。 它不包含有关它所包含内容的编译时间信息,并且在使用sizeof查询时将返回指针的大小(32位为4位,64位为8位)。 指针具有内置的operator[] (在C ++中可以覆盖),使它们充当数组。

指针更灵活,可以更改为指向的内容,而数组则不能。 填充数组的唯一方法是使用strcpy,memcpy或类似的手动副本。 指针可以自由分配到任何内存位置的第一个和第N个元素,以便在内容上具有更大的灵活性。

1)* char string1; 是指向(可能)字符串的指针

2) char string2 []; 更明确的是,有意指向一个数组

无论哪种方式,您仍然需要分配内存来保存所述字符串。 从优雅的角度来看,我会选择#2。