5

我有这个函数签名:

void myFunction(int *const ptr);

在这个特定的上下文中,const关键字的意义是什么?

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

void myAnotherFunction(int *ptr);

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

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

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

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

4

2 回答 2

5

如果您认为该功能可能更有意义

void myFunction(int *const ptr);

可能正在操作许多指针,并分配它们并重新分配它们,并且它正在执行的算法的不变性是永远不应更改输入指针。然后,给它贴上标签const可能会很有帮助,或者至少让你对它被正确实施更有信心。

于 2015-10-03T18:36:02.720 回答
4

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

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

ptr = &y;
*ptr = 9;

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

于 2015-10-03T18:34:59.660 回答