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