Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“的含义;常量字符**p“;在c中_C_Constants - Fatal编程技术网

“的含义;常量字符**p“;在c中

“的含义;常量字符**p“;在c中,c,constants,C,Constants,如果我此后首先为10个字符指针分配内存,然后为每个要指向的字符指针分配内存,那么p是应该使10个字符指针只读,还是应该使字符串本身只读 感谢和问候。常量字符**p声明指向常量字符的指针 因此,修改字符p[i][j]是不正确的,而修改指针p[i]是正确的 C11(n1570),§6.3.2.1左值、数组和函数指示符 可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有常量限定类型,,如果它是一个结构或联合,则没有任何成员(递归地包括所有包含的聚合或联合的任何成员或元素)具有常量- 合格类

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


感谢和问候。

常量字符**p
声明指向
常量字符的指针

因此,修改字符
p[i][j]
是不正确的,而修改指针
p[i]
是正确的

C11(n1570),§6.3.2.1左值、数组和函数指示符 可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有常量限定类型,,如果它是一个结构或联合,则没有任何成员(递归地包括所有包含的聚合或联合的任何成员或元素)具有常量- 合格类型

而且,要使用诸如
=
+
之类的运算符,操作数必须是可修改的左值

此外,类似这样的代码:

char **q = (char **)p;
q[i][j] = c;
导致未定义的行为:

C11(n1570),§6.7.3类型限定符 如果试图修改使用 通过将左值与非const-qualified一起使用来限定const-qualified类型 类型,则行为未定义


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

在本例中,p是指向常量字符的指针。也许写它更简单的方法是

 char const **p
(此代码与您编写的代码相同)。如果你从右向左读,你会看到p代表什么


在这种情况下,无法使用*p修改指向的字符。但是,您可以更改p或*p指向的对象

在调用UB之前修改常量值的不当尝试不会导致编译器诊断吗?@JohnZwinck:我希望现在看起来更清楚。键入修改字符p[I][j]是正确的吗?如果我改为说
typedef char*chptr;常数chptr*p
?@aditya:在这种情况下,
p
是指向
char*
const
指针。所以,是的,有区别。
 char const **p