为什么在函数声明中传递const指针参数无效

时间:2019-04-10 13:06:38

标签: c pointers arguments

问题描述

我有一个函数,该函数接受一个指向const double数组的const指针,在该数组上我使用大小作为my_func内的边界检查进行循环。

.h中的

声明

void my_func(const double * const my_array, size_t size);

.c

中的实现
void my_func(const double * const my_array, size_t size) {
  for (size_t idx = 0; idx < size; idx++) {
    do_something_with(my_array[idx]);
  }
}

我不希望在函数内部更改指针,因此使其变为* const。我不希望它指向的数据被更改,因此const double

Clang-Tidy但是希望我让函数 declaration 删除指针上的const,使其成为

void my_func(const double * my_array, size_t size);
  

Clang-Tidy:参数'my_array'在函数声明中是const限定的;参数的const限定仅在函数定义中起作用

如果我遵循该建议,但又希望保持上面的约束,那么我的函数声明和定义将不再相同。

问题

1)
假设我的指针参数不是const(const double * pointer_arg),如果我在函数内部将pointer_arg更改为指向另一个const double,该更改在函数外部是否可见?也就是说,在我执行函数的那一行之后,填充pointer_arg指向哪里?如果看不见,是否表示指针已按值复制?这有可能吗?

2)
声明中的const不起作用的决定背后的原因是什么?

3)
在声明和定义中使用不同的函数签名可能会有什么好处?对我来说,看我的头文件还不清楚实现的工作原理,它在函数内部是const,不是吗?这使我或代码协作者感到困惑。

4)
我应该在声明中删除const吗?在这种情况下,什么是最佳实践

2 个答案:

答案 0 :(得分:5)

  

1)   假设我的指针参数不是const(const double * pointer_arg),如果我将函数内部的pointer_arg更改为指向另一个const double,则该更改在函数外部是否可见?

不,它不可见。

  

也就是说,在执行函数的那一行之后,填充指针指针指向何处?

与以前相同。

  

如果不可见,是否表示指针已按值复制?这有可能吗?

就是这样。

  

2)   声明中的const不起作用的决定背后的原因是什么?

由于它是按值转移的,因此const无效(对调用者而言)。

  

3)   在声明和定义中使用不同的函数签名可能会有什么好处?

没有。实际上,它甚至不应该在C ++中编译。

  

4)   我应该在声明中删除const吗?在这种情况下,最佳做法是什么?

是的,您应该放下const,因为它没有太大帮助。您只是禁止该函数更改其指针副本,而调用者无需担心。

答案 1 :(得分:0)

const右侧的*属性仅影响指针本身,而不影响所指向的内存,指针本身存储为自动变量。

void my_func(const double * my_array, size_t size);

相同
void my_func(const double * const my_array, size_t size);

在使用my_array的情况下,const仅影响实现。 my_array具有自动存储期限,并且在应用const时无法在实现中更改。

给出原型:

int add(int a, int b);
// same as
int add(int const a, int const b);

有用的用法,强制将参数ab保持在函数内部不变:

int add(int const a, int const b) {
    // a = a*b; // error
    return a+b;
};