下面是“标准C库”中strlen.c的实现,
size_t strlen(const char *s){
const char *sc;
for(sc = s; *sc != '\0'; ++sc)
return (sc-s); }
我对sc = s
合法性的理解正确吗?
sc=s
是合法的赋值,因为由于两个变量都声明为const
,所以两个变量都保护s指向的对象。在这种情况下,更改sc或s都指向的位置是合法的,但是对*s
或sc
的任何赋值(或引用?)都是非法的。
答案 0 :(得分:5)
我认为您要问的是 const 关键字的含义。如果没有,请澄清您的问题。
我想的方式是任何const变量都可以存储在ROM(只读存储器)中,未声明const的变量可以存储在RAM(随机存取存储器)中。这种类型取决于您使用的计算机的类型,因此const数据实际上可能不会存储在ROM中,但是可能会存储在ROM中。
因此,您可以对指针本身做任何想做的事,但不能更改其指向的内存中的数据。
这意味着您可以引用指针,并根据需要传递该指针。另外,您可以为指针分配一个不同的值。
说你有这个代码
const char* foo = "hello";
const char* bar = "world";
这样做完全合法
foo = bar;
现在两个都指向“世界”
这样做也是合法的
const char *myPtr = bar;
myPtr = foo;
您不允许执行的操作是更改实际的数据存储器,以便您不可以执行操作
foo[0] = 'J';
答案 1 :(得分:2)
您是正确的。
const char * sc
声明一个指向const char
的指针。从本质上讲,这意味着sc指向类型为char
的变量(或者在这种情况下为char
的连续数组) ,并且您不能使用{{1修改指向的变量。实时观看here。
请注意,sc
本身不是一个sc
变量。 const
适用于指向的变量,而不适用于指针。因此,您可以更改指针的值 ,即指针所指向的变量。
遵循此答案可以更深入地了解const
和指针的不同用法:What is the difference between const int*, const int * const, and int const *?
答案 2 :(得分:2)
我对sc = s合法性的理解正确吗?
是的,只需要最后一部分的一些细节。
...但是对
*s
或sc
的任何赋值(或引用?)都是非法的。
(我怀疑OP的意思是“ ...或*sc
将是非法的。”)
引用s
或sc
指向的内容就像在char ch = *sc;
中一样
尝试更改 *s
或*sc
的值是未定义行为(UB),而不是{{1 }}
(请参见good additional detail by @rici)
对于UB,分配可能有效,它可能在星期二不起作用,代码可能会崩溃,等等。C并未定义发生什么情况。确定性代码不应尝试这样做。