C语言中这两种形式的字符串变量有什么区别?
char *string1; char string2[];
还有其他办法吗?
非常感谢你.
char *string1 = "foo";
string1是指向字符串文字的指针(为了参数,它指向存储在程序的只读数据段中的一系列字符).
char string2[] = "foo";
string2是一个包含4个字符的数组.它用字节'f','o','o',ASCII_NUL初始化.
可能最显着的区别是,如果你这样做,string1[0] = 'b';
你会得到未定义的行为,因为你试图修改存储的表示形式的字符串文字.如果您这样做,string2[0] = 'b';
那么您将个人字符串修改为"boo",这很好.
通常,类型的变量char*
是指向char的指针.它通常用于指向NUL终止的字符序列中的第一个字符,在这种情况下,它指向一个字符串.类型的变量char[]
是字符数组.如果它有一个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语法,但是我使用的定义在函数或文件范围内,在任何函数之外都是有效的.无论哪种方式,它们的行为与我所描述的初始化和赋值一样,但它们的生命周期不同.]