bil*_*ial 5 c const-correctness parameter-passing const-pointer
我有这个函数签名:
void myFunction(int *const ptr);
Run Code Online (Sandbox Code Playgroud)
什么是点const的关键字在这个特定背景下?
即使ptr不是const变量,我也无法修改它指向的地址,因为它是按值传递的,所以如果我有另一个这样的函数:
void myAnotherFunction(int *ptr);
Run Code Online (Sandbox Code Playgroud)
在它的实现中做了这样的事情:
//...
ptr = malloc(1023);
//...
Run Code Online (Sandbox Code Playgroud)
这不会影响传递的值(当然在这个函数之外)。
所以问题是:使用myFunction()签名而不是签名myAnotherFunction()有什么意义?(除此之外,您还会收到编译时错误)。
ptr = malloc(1023); 这个伤口不会影响传递的值(当然,在这个函数之外)。
总结。事实上,这样原始指针不会受到影响(它仍然指向同一个对象,因为ptr是原始指针的副本),但您仍然可以使该指针指向内部的不同对象myAnotherFunction,并通过该指针更改该对象的值。例如myAnotherFunction你可以这样做:
ptr = &y;
*ptr = 9;
Run Code Online (Sandbox Code Playgroud)
而在第一种情况下,当您有一个常量指针时,您无法为其分配新地址,但您仍然可以使用取消引用来更改它指向的对象的值。常量指针意味着您不能为其分配新地址,指向常量对象的指针意味着您不能更改它所指向的对象的值,但您可以为指针分配新地址。
如果您认为该功能可能更有意义
void myFunction(int *const ptr);
Run Code Online (Sandbox Code Playgroud)
可能正在操作许多指针,并对它们进行分配和重新分配,并且它正在执行的算法的一个不变性是输入指针永远不应该改变。然后,为其添加标签const可能会非常有帮助,或者至少让您更有信心它已正确实施。