c - 为什么在 C 中使用指针定义时,我们将 `const` 用于字符串?

标签 c arrays string pointers constants

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/

相关文章:

c++ - 为什么zmq将多个消息打包到一个TCP帧中?

java - '-> NewGlobalRef' 的 Left 必须指向 struct/union 是什么意思?

java - 打印数组、设置数组

javascript - 在 Javascript 中按子数组键的长度对数组进行排序

string - 定义字母数字子类型的任何优雅方式?

c - 低于低级别的普通 bsd 套接字

c - 为什么在 C 程序中在 #include 指令的 fileName 之后写入任何内容不会给出任何错误?

javascript - 减少嵌套的 Promise

.net - 字符串的 C++ 含义^

java - 如何找到所有特殊字符并将其打印在给定字符串中?