常量保护具有的变量是什么意思 是通过指针传递给函数的吗?
例如:
int f ( const int vec[]);
以下命令不合法:
vec[i] = exp;
答案 0 :(得分:4)
const
保护它的左侧,除非它的左边没有任何东西,然后它只保护它的右侧。在这种情况下,它会保护vec
中包含的值。
这些示例可以帮助您理解这一点:
指向const变量的指针:
int vec[] = {1,2,3};
int const *ptr = vec;
ptr[1] = SOMETHING; //ERROR :(
指向变量的 const指针:
int vec[] = {1,2,3};
int* const ptr = vec;
ptr[1] = SOMETHING; //OK :)
ptr = NULL; //ERROR :(
这些图片可以帮助您更好地理解这一点:
答案 1 :(得分:1)
const是编译器强制执行的限定符。什么
const int vec[];
意思是你不能修改vec中包含的int。
注意:这并不意味着内存不可修改。人们倾向于将const误认为运行时保证来保护那部分内存......事实并非如此。这只是c编译器强制执行的操作,试图保护程序员不要做蠢事。
编辑:const最明显的用途,因为它与函数调用有关,就是当你想通过引用传递东西时,因为它们很大并且复制它们会很昂贵。但是你想保证函数不会修改它们。
int someFunction(const int ¬Changeable, int &modifiable);
在上面的声明中,someFunction可以更改可修改的整数,并且由于它是通过引用传递的,因此对于调用例程也会更改。不应修改notChangeable int。
下面是一些使用const和指针可以做的令人讨厌的事情的例子。由于人们在谈论修改内存,并且只是编译时保证,我想我会演示这对你意味着什么。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
const int* intOne = new int(10);
int* intTwo = new int(20);//Toggle these two lines
//int* const intTWo = new int(20);//Toggle these two lines
cout << *intOne << " " << *intTwo << endl;
intTwo -= sizeof(int); //Let's move our pointer back one integer!
*intTwo = 50000;//Now let's change that integer
cout << intOne << " " << intTwo << endl;//INteresting our pointers point to the same memory now
cout << *intOne << " " << *intTwo << endl;//And we were able to modify *intOne... even though it was const.
}
还要注意我们已经泄露了intTwo所指出的内容,虽然我们知道如何回到它,所以这并不可怕。如果你想看到使指针保持不变和它指向不变的东西之间的区别,你可以切换我评论过的两行。
预期输出:
10 20
0x1061009e0 0x1061009e0
50000 50000
答案 2 :(得分:0)
声明可以读作“int
的数组,它们是const”,或“不能更改其值的整数数组”。这就是为什么这个命令不合法:它会改变其中一个整数的值。
答案 3 :(得分:0)
当某个变量在参数列表中声明为const
时,该变量无法在函数体中修改。编译器将捕获任何尝试这样做的尝试。换句话说,声明为const
的变量不是合法左值。
答案 4 :(得分:0)
它使代码内部函数不会意外地修改传递对象的数据 因为编译器会出错。
数组通过其基址的引用传递。对于像int
变量这样的普通原语不是这种情况,如果传递一个整数,则在函数的作用域中创建局部变量并传递值,如果是chnages,则它们仅对局部变量起作用。但是,由于数组不是这种情况,您可能会意外地修改array[i]=2
之类的内容。但是,如果使用const
限定符声明,则会阻止此操作。这就是关键字的本质。
这就是为什么许多人使用该原型,特别是图书馆作家。因为,库被大量用户使用。由于意外写入,函数中的一个错误可以与用户的堆栈一起播放...
当然,但这可能无法阻止故意攻击,因为它只能编译时间,而且可以轻松解决这个问题。
答案 5 :(得分:0)
这是一个修饰符,以确保您不直接修改变量值 。它不会保护您不以其他方式修改内存,例如通过指针。当你知道你不想改变某些东西时,使用它会很好,但是依赖它会很糟糕。
答案 6 :(得分:0)
其他人已经说过,声明中显示的const *
参数告诉编译器指向的数据是只读的。
我想给出更高层次的解释,说明为什么人们想要以这种方式声明函数的参数。
该声明背后的想法是告诉读者您的应用程序,您的函数不会修改您传递的数据。
这是您的界面所做的承诺,告诉它不会产生意外的副作用。
相反,缺少const声明表明缓冲区可能会被更改。
这也是为什么将const *
传递给只需要一个简单*的函数会产生警告但反过来不会产生警告的原因。
示例:strlen
被声明为size_t strlen (const char *s)
,我可以推断出我可以调用它而不会有修改数据的危险。
strtok
被声明为char *strtok (char *s, const char *delim)
,我认为我传递的缓冲区已被修改,必须小心。
TL; DR const添加有关函数属性的信息。