如果我从今以后首先为 10 个字符指针分配内存,然后为每个要指向的字符指针分配内存,那么 p 应该使 10 个字符指针只读还是应该使字符串本身读取-只要?
谢谢并恭祝安康。
const char **p
声明一个指向指针的指针const char
。
cdecl> declare p as pointer to pointer to const char const char **p
因此,修改一个字符p[i][j]
是不正确的,而修改一个指针p[i]
是正确的。
C11 (n1570),第 6.3.2.1 节左值、数组和函数指示符
可修改的左值是没有数组类型,没有不完整类型,没有 const 限定类型,并且如果它是结构或联合,则没有任何成员(包括递归地,任何成员或所有包含的聚合或联合的元素)具有 const 限定类型。
而且,要使用=
or等运算符++
,操作数必须是可修改的左值。
此外,像这样的代码:
char **q = (char **)p;
q[i][j] = c;
导致未定义的行为:
C11 (n1570),§ 6.7.3 类型限定符
如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为未定义。
const
绑定到,因此这char
意味着您有 10 个指向无法修改字符的字符串的指针(无论如何,通过这些指针!)。
在这种情况下,p 是一个指向 const char 的指针。也许更简单的写法是
char const **p
(此代码等同于您编写的代码)。如果你从右到左阅读它,你会看到 p 代表什么。
在这种情况下,不能使用 *p 修改指向的字符。但是,您可以更改 p 或 *p 指向的内容。