当参数是const时理解函数声明?

时间:2017-07-17 12:40:36

标签: c function

给出以下函数定义:

void f(int const ** ptr_ptr_a);

您如何理解该功能的作用及其保证的内容。

  1. 该函数将int **作为参数,并保证不会发生任何更改,只发生在函数范围内的**ptr_ptr_a
  2. 该函数使用int const **作为函数参数,这意味着它强制传递的参数在进入函数范围之前需要保持不变。
  3. 动机来自于试图理解以下示例给出的警告:

    void f(int const **ptr_ptr_a){
    }
    
    int main(int argc, char *argv[])
    {
        int * ptr_a;
        f(& ptr_a); // warning: passing argument 1 of ‘f’ from incompatible pointer type [-Wincompatible-pointer-types]
    }
    

    假设定义1.是正确的

    警告没用,让我们认为函数内部会担心变量在函数范围之外的行为。

    假设定义2.是正确的

    意味着声明参数并暗示在调用期间传递给函数的参数的限定符应该具有,在这种情况下我感到困惑。

    我会请求解释为什么在C中只有pass by value是可行的,这是有用的。

2 个答案:

答案 0 :(得分:2)

声明int const ** p(或const int ** p)声明p是指向int const指针的指针。

因此,指定的合同是f()不会执行以下操作

**ptr_ptr_a = 1;

即。它不会写入引用的int

然而,完全可以自由地更改ptr_a的值

*ptr_ptr_a = 0;

要删除警告,ptr_a需要声明为int const * ptr_a;const int * ptr_a;(更为惯用)。

现在,这个警告没用吗?考虑一个嵌入式控制器,其中指针大小对于指向RAM和ROM / FLASH的指针是不同的(是的,我已经在那些工作)。您当前的ptr_a无法处理位于高读取内存中的int

答案 1 :(得分:0)

两种定义都不正确。当你宣布

void f(int const ** ptr_ptr_a);

您告诉编译器此函数采用指向const int的指针。警告是编译器告诉您,您没有遵守自己的合同。