0

如果我从今以后首先为 10 个字符指针分配内存,然后为每个要指向的字符指针分配内存,那么 p 应该使 10 个字符指针只读还是应该使字符串本身读取-只要?

谢谢并恭祝安康。

4

3 回答 3

2

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 限定类型定义的对象,则行为未定义。

于 2013-04-10T12:22:39.793 回答
0

const绑定到,因此这char意味着您有 10 个指向无法修改字符的字符串的指针(无论如何,通过这些指针!)。

于 2013-04-10T12:22:41.850 回答
0

在这种情况下,p 是一个指向 const char 的指针。也许更简单的写法是

 char const **p

(此代码等同于您编写的代码)。如果你从右到左阅读它,你会看到 p 代表什么。

在这种情况下,不能使用 *p 修改指向的字符。但是,您可以更改 p 或​​ *p 指向的内容。

于 2013-04-10T12:23:56.193 回答