For defining arrays with pointers, we write
int *const a;
because arrays have variable values but constant pointers. But for strings, we write
const char *s;
.
我不明白为什么。这样对吗?字符串在 C 语言中真的有常量值和变量指针吗?
最佳答案
考虑以下几点:
char* a;
char* const b = "Hello"
const char* c;
const char* const d = "world";
a
只是指向一个字符。这可能是字符串的第一个字符,或单个字节。可以通过编写 *a='Z'
或 a[0]='q'
或将 a
传递给函数来修改该字符采用 char*
参数。指针本身也可以修改为指向其他一些字符,例如a=b;
或 a="foo";
。这是最灵活的形式,也是最不安全的形式,因为您可以用它做任何事情。
b
是指向字符的常量指针。在本例中,它指向一个字符数组。这些字符可以修改,例如b[1]='a';
或 *b=0;
但 b
本身是常量,这意味着它永远不能指向 a内存的不同部分。当您分配了一个缓冲区或数组,其内容要修改但不能移动时,可以使用这种形式,因为它是由操作系统分配的。
c
指向一个常量字符。您可以更改它指向的内容 (c="foo";
或 c=b;
) 但您不能使用此指针更改它指向的字符 -- 即使它指向非常量缓冲区 b
。这种形式通常在处理预生成的字符串时使用。您可以使用此变量来存储找到的字符串,并传递它们的地址,只要您不更改字符串本身即可。
d
是指向常量字符的常量指针。您不能更改它指向的字符,也不能将指针本身指向不同的内存位置。您所能做的就是读取字符串或单个字符(char e=d[4];
或 puts(d);
)。这种形式主要在传递引用字符串时使用,例如在命名真实对象时。
关于c - 为什么在 C 中使用指针定义时,我们将 `const` 用于字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52003506/