能有人给我解释一下这些代码行之间的区别吗?
在什么情况下我应该使用上述每个选项?
char *p = "String";
char p2[] = "String";
char p3[7] = "String";
在什么情况下我应该使用上述每个选项?
这个链接 应该能够满足您的好奇心。
基本上(忘记了你的第三个例子,它是错误的),1 和 2 的区别在于 1 为数组分配指针的空间。
但是在代码中,您仍然可以像指针一样操作它们——唯一的问题是,您不能重新分配第二个。
C中的字符串被表示为字符数组。
char *p = "String";
根据《C程序设计语言第二版》,您正在声明一个指向存储在程序中某处的字符串的指针(修改该字符串是未定义行为)。
char p2[] = "String";
您正在声明一个char类型的数组,并用字符串"String"进行初始化,让编译器来计算数组的大小。
char p3[5] = "String";
你在声明一个大小为5的数组并用"String"进行初始化。这是一个错误,因为"String"无法适配到5个元素。
char p3[7] = "String";
是正确的声明方式('\0'是c字符串中的终止字符)。
你不应该使用第三个,因为它是错误的。"String" 占用7个字节,而不是5个。
第一个是指针(可以重新分配到另一个地址),其他两个被声明为数组,不能被重新分配到不同的内存位置(但它们的内容可能会改变,使用 const
来避免这种情况)。
char p3[5] = "String";
这段代码虽然在 C 语言中是有效的(但在 C++ 中无效),并且不会出错,但是有一定的危险性。 - ouahchar *p = "String"; means pointer to a string type variable.
char p3[7] = "String"
; 这句话的意思是你预定义了数组的大小,不超过5个元素。请注意,对于字符串来说,空字符"\0"也被视为一个元素。因此,这个语句会报错,因为元素的数量是7,所以应该这样写:
char p3[7]= "String";
p3[6]
:你必须考虑到最后的 0。 - fge