【问题标题】:Meaning of const pointers as function parametersconst 指针作为函数参数的含义
【发布时间】:2015-10-03 18:32:44
【问题描述】:

我有这个函数签名:

void myFunction(int *const ptr);

const 关键字在此特定上下文中的意义何在?

即使ptr 不是const 变量,我也无法修改它指向的地址,因为它是按值传递的,所以如果我有另一个这样的函数:

void myAnotherFunction(int *ptr);

在它的实现内部做了这样的事情:

//...
ptr = malloc(1023);
//...

这不会影响传递的值(当然是在这个函数之外)。

所以问题是:使用myFunction() 签名而不是myAnotherFunction() 有什么意义? (除了你得到一个编译时错误)。

【问题讨论】:

  • 这对于重构很有用。例如,将一段代码提取到 ptr 曾经是局部变量的函数中。 const 是检查 ptr 在该块期间未更改的好方法,这会使新代码具有不同的行为。
  • 注意:最小原型仍然是void myFunction(int *);它不关心int *const ptr,因为它必然会在函数结束时被删除,所以它忽略了它;它会影响函数的作用域。

标签: c parameter-passing const-correctness const-pointer


【解决方案1】:

如果你认为这个函数可能更有意义

void myFunction(int *const ptr);

可能正在操作许多指针,并分配它们并重新分配它们,并且它正在执行的算法的不变性是输入指针永远不应更改。然后,将其标记为 const 可能会非常有帮助,或者至少让您对它已正确实施更有信心。

【讨论】:

    【解决方案2】:

    ptr = malloc(1023); 这个伤口不会影响传递的值(在这个函数之外, 当然)。

    总结一下。确实这样原始指针不会受到影响(它仍然会指向同一个对象,因为ptr 是原始指针的副本),但是您仍然可以使该指针指向myAnotherFunction 内的不同对象并更改其值对象通过该指针。例如在myAnotherFunction 你可以这样做:

    ptr = &y;
    *ptr = 9;
    

    而在第一种情况下,当你有一个常量指针时,你不能给它分配一个新的地址,但是你仍然可以使用解引用来改变它指向的对象的值。常量指针意味着您不能为其分配新地址,指向常量对象的指针意味着您无法更改它指向的对象的值,但您可以为指针分配新地址。

    【讨论】:

    • 你说:Meaning you can't assign new address to that variable。好的,假设指针不是const,您将如何为其分配新地址?关于这是我的问题。
    • @MariusMarusanici:通常情况下,就像您通常会做的那样(只是更改不会在原始指针中可见)
    • 那么如果更改在原始指针中不可见,那么const 关键字的意义何在?
    • 好的,太好了,不知何故我只考虑了原始传递的指针状态。
    • @MariusMarusanici:很高兴这有帮助。始终按值传递参数,因此 ptr 是原始指针的副本,并且只是 ptr=newAddress,不会更改原始指针(但如果这是 const 你甚至不能写)
    猜你喜欢
    • 2018-09-02
    • 2020-08-12
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多