【问题标题】:C: difference between 'struct Table *const' and 'const struct Table *'?C:'struct Table *const'和'const struct Table *'之间的区别?
【发布时间】:2017-12-09 13:48:29
【问题描述】:

我创建了一个这样的结构:

typedef struct Table {
    #some members
  } Table;

typedef struct Table *TableP; // pointer to Table

我想在下面的函数中使用它(给我)

int insert(const TableP table, const void *key, DataP object)

但 Clion 在函数中突出显示 table,并给出警告:“'table' 声明为 const 限定 typedef 类型;导致类型为 'struct Table * const' 而不是 'const struct Table *'”

我不太确定这意味着什么。我尝试将我的表结构更改为 const,但它不会更改警告。

【问题讨论】:

    标签: c struct constants


    【解决方案1】:

    struct Table * constconst struct Table* 之间的区别?

    struct Table * const 表示const pointer to struct Table

    const struct Table* 表示pointer to a struct Table which is constant

    在第一种情况下,指针是常量,但 struct Table 不是。您可以修改表的属性。但是你不能改变指针指向不同的表。

    第二种情况,指针是非常量的。您可以使其指向任何结构表,但如果您尝试修改最初指向的表的属性,则会引发错误。


    你做了什么,为什么会出错?

    您已使用typedef struct Table *TableP;。现在const TableP 并不意味着const struct Table*。它只是表示const pointer to a struct TablePstruct TableP* const。这就是编译器对你说的。

    解决方案是在编写函数时直接在代码中使用struct Table *const table。这就是你想要的——这里的意思是table is a constant pointer to a struct Table。这也更具可读性和易用性。

    加分

    这就是为什么将指针隐藏在typedef 后面不是一个好主意的原因——它会妨碍可读性,并且会遇到一些像这样的奇怪情况。

    注意:最好的方法是简单地typedef 应该直接使用结构和指向它的指针。

    typedef struct {
       ....
    }Table;
    
    void someFunc(Table *t);
    

    【讨论】:

      【解决方案2】:

      案例 1

      typedef struct Table *TableP;
      

      这里Tablep 是指向结构表的指针。写的时候

      const TableP table,会这样定义const struct Table*

      那么const struct Table*是什么意思,意思是地址constant,你不能改变地址但是你可以修改它的成员值。

      例如

       struct Table {
        int x ;
        } v = {10}, v1 ={20};
      
      typedef struct Table  *Tablep;
      int main() {
              const Tablep table = &v ;//it becomes const pointer i.e you can't change address 
              table = &v1;// it's not possible.. address is contsant
             // table->x = 99;// possible.. can change it's member value
      
      return 0;
      }
      

      注意:const Tablep localTablep const local 是相同的。

      希望对你有帮助。

      【讨论】:

      • const TableP tabletable 声明为指向struct Tableconst 指针,即struct Table * const,而不是const struct Table *
      • const struct Table * 不代表不能更改地址,但可以更改成员。恰恰相反;它是一个指向常量结构的可变指针。
      • @EricPostpischil 如果地址不是常数,那么为什么table = &v1 给出错误?我希望通过 table = &v1 我正在尝试更改地址。
      • 正如我所写,const TableP table 声明 tableconst 指针。 (您在回答中同时使用了TablePTablep,显然它们之间没有任何区别。为了与OP 的问题保持一致,我将使用前者。)因此,在table = &v1 中,它试图更改指针那是const,因此它会出错。我不同意代码和报告的错误。我不同意您的说法“当您编写 const TableP table 时,它将被定义为这样的 const struct Table*。”那是错误的。它将是struct Table * const
      • 还有,“那么const struct Table*是什么意思,表示地址constant,地址不能改,但是可以修改成员值。”是假的。 const struct Table* 表示指向 const struct Table 的非常量指针。
      猜你喜欢
      • 2020-07-09
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多