给出以下函数定义:
void f(int const ** ptr_ptr_a);
您如何理解该功能的作用及其保证的内容。
int **
作为参数,并保证不会发生任何更改,只发生在函数范围内的**ptr_ptr_a
。int const **
作为函数参数,这意味着它强制传递的参数在进入函数范围之前需要保持不变。动机来自于试图理解以下示例给出的警告:
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]
}
警告没用,让我们认为函数内部会担心变量在函数范围之外的行为。
意味着声明参数并暗示在调用期间传递给函数的参数的限定符应该具有,在这种情况下我感到困惑。
我会请求解释为什么在C中只有pass by value
是可行的,这是有用的。
答案 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
的指针。警告是编译器告诉您,您没有遵守自己的合同。