为什么“const char * const”不用作C中函数的输入字符串参数?

问题描述 投票:0回答:1

这里有一个关于 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
不是更干净吗?

谢谢

c pointers constants
1个回答
0
投票

我们先来看一个更简单的案例。

给定

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
只会束缚函数的编写者。这样做的好处对我来说是难以捉摸的。

© www.soinside.com 2019 - 2024. All rights reserved.