const指针作为函数参数的含义

时间:2015-10-03 18:32:44

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

我有这个功能签名:

void myFunction(int *const ptr);

此特定情境中const关键字的重点是什么?

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

void myAnotherFunction(int *ptr);

在其实现中做了类似的事情:

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

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

所以问题是:使用myFunction()签名而不是myAnotherFunction()签名是什么意思? (除此之外,您会收到编译时错误)。

2 个答案:

答案 0 :(得分:3)

如果考虑功能

,可能会更有意义
void myFunction(int *const ptr);

可能正在操作许多输入指针,并分配它们并重新分配它们,并且它正在执行的算法的不变量是输入指针永远不应该被改变。然后,标记const可能非常有用,或者至少让您对自己的实施方式更有信心。

答案 1 :(得分:2)

  

ptr = malloc(1023);   这个伤害会影响传递的值(在此函数之外)   疗程)。

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

ptr = &y;
*ptr = 9;

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