这里有一个关于 C 中指针的有用提醒:
int * mutable_pointer_to_mutable_int;
int const * mutable_pointer_to_constant_int;
const int * mutable_pointer_to_constant_int;
int *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;
const int *const constant_pointer_to_constant_int;
现在,假设我有一个函数
do_something
,它接受一个字符串作为输入。该字符串不会被修改。我会写这样的东西:
void do_something(char const* const string);
事情是这样的:当查看微控制器制造商提供的 API 代码(应该写得很好)时,在这种情况下,我很少看到类型
char const * const
用作输入类型。相反,他们通常会写 char const*
字符串或 const char*
字符串。
这有什么具体原因吗? 把指针本身也制作成
const
不是更干净吗?
谢谢
我们先来看一个更简单的案例。
给定
void do_something1( int i );
void do_something2( const int j );
以下内容适用:
i
是 int
类型的对象。j
是 int
类型的常量对象。那么,
do_something1
可以修改i
,且以下内容有效:
void do_something1( int i ) {
++i; // ok
printf( "%d\n", i );
}
do_something2
不允许修改string2
,以下无效:
void do_something2( int j ) {
++j; // ok
printf( "%d\n", j );
}
请记住,参数是其函数的本地参数,因此对它们的更改对调用者没有影响。所以设置参数
const
只会束缚函数的编写者。这样做的好处对我来说是难以捉摸的。
这同样适用于您的代码。
给定
void do_something3( char const *s );
void do_something4( char const * const t );
以下内容适用:
s
是指向char
类型常量对象的指针。t
是指向char
类型常量对象的常量指针。那么,
do_something3
可以修改s
,且以下内容有效:
void do_something1( char const *s ) {
while ( *s ) {
putchar( *s);
++s; // ok
}
}
do_something2
不允许修改t
,以下无效:
void do_something2( char const *t ) {
while ( *t ) {
putchar( *t );
++t; // XXX
}
}
再次记住,参数是其函数的本地参数,因此对它们的更改对调用者没有影响。所以设置参数
const
只会束缚函数的编写者。这样做的好处对我来说是难以捉摸的。