很抱歉,您的理解并不完全正确。
char *
指向字符数据,并且因为没有const
,所以可以对指向的数据进行写入。
但是,以下做法也是完全可行的:
char *a = "hello";
因为字符串文字存储在只读内存中,但不被语言的语法视为常量,所以它会给你一个读/写指针来读取只读数据。
最好将上述内容改写为:
提供一个读/写指针以读取只读数据,因为字符串字面常量存储在只读内存中,但不被语言的语法视为常量。
const char *a = "hello";
为了使“你不能修改指向a的数据”这一点更清晰,请注意一下,您混合使用malloc()和赋值的示例是错误的。以下是正确的做法:
char *dest = malloc(5);
dest = "FIVE"; /* BAD CODE */
这是糟糕的代码,请勿模仿。它只是简单地用字符串字面量"FIVE"
覆写了由dest
返回的指针,该字符串存在于(再次强调,只读)内存中。
使用strcpy()
来将新分配的内存初始化为字符串数据是正确的方法:
char *dest = malloc(5);
if(dest != NULL)
strcpy(dest, "five");
请注意,检查malloc()
的返回值是一个好习惯。
重复向同一内存写入并没有问题,这是C语言中非常基本的概念;变量代表内存,并且可以通过“覆盖写入”在不同时间赋予不同的值。
就像这样简单的例子:
int a = 2;
printf("a=%d\n", a);
a = 4;
printf("a=%d\n", a);
You can extend the above malloc()
-based example:
展示了这一点,当然对于字符串来说也同样适用,因为它们只是内存块。
您可以扩展上面的基于
malloc()
的示例:
char *dest = malloc(5);
if(dest != NULL)
{
strcpy(dest, "five");
printf("dest='%s'\n", dest);
strcpy(dest, "four");
printf("dest='%s'\n", dest);
strcpy(dest, "one");
printf("dest='%s'\n", dest);
}
并且它会打印:
dest='five'
dest='four'
dest='one'
char*指向一个字符串常量
- 不对。一个适当设置的char *
指向一个**char
*。它是否是以适当的空字符结尾的char
序列,取决于所访问数据的特性,并且它并不是常量。在您提供的列表中,数组(如char[]
)的一般描述更接近现实。指针持有一个地址;数组是*一个地址。 - WhozCraig