今天讨论const,首先变量往往是量化的。为什么变量经常被量化,有很多好处。比如可以让数据更安全,不被修改。
目录
I,int const a/const int a II,const int(*p)/int const(*p) III,int*const p IV,const用作函数的地址传递参数
一、int const a / const int a
Int和const都是用作类型限定词,地位相同,所以谁先谁后并不重要。题目中的两种写法是一致的。
这是我们的常规用法,我们发现在这种情况下不能对A做任何改动。
int main() {
int const a=10
printf('%d\n ',a);
返回0;
}
真的改不了吗?不一定
int main() {
int const a=10
int * p=a;
* p=20
printf('%d\n ',a);
返回0;
}
成功修改。这是为什么呢?其实也很简单。和编译器有关系。gcc编译器中的const是编译器在编译的时候实现的,也就是检查的时候,我发现你没有修改A的值,所以我觉得你是对的。更进一步的原因是,gcc还把const类型的常量放在数据段中,这实际上和普通全局变量在数据段中的实现方式一样,只不过编译器确定这个变量是const,而且运行时没有标记const标志,只要糊弄编译器就可以修改。
这本质上是C语言的问题,因为C语言没有强制要求const不能修改。因此,在C语言中使用const就像是一种道德约束而不是法律约束。所以人们在使用const的时候,更多的是在传递一个信息,就是告诉编译器和读者,这个变量不应该也不需要修改。而且,在我的理解中,这个东西实际上被设置成了强制的、不可变的,这在一定程度上限制了C语言的灵活性。C的奇招难道不依赖于C语言的灵活性吗?所谓bug改变特性,这是我的猜测。我想知道丹尼斯里奇是否也这么想。
二、const int(*p)/int const(*p)
其实题目很好理解。我们修改了*p,使得p的点不能改变。
int main() {
int a=10
int const(* p)=a;
printf('%d\n ',* p);
返回0;
}
上面的程序很好理解。P指向A,P被const修改,被指向的对象A不能再被修改。下面的程序输出20表明有问题。这还是我们上面讲的问题。这是君子协定。
int main() {
int a=10
int const(* p)=a;
a=20
printf('%d\n ',* p);
返回0;
}
以下四种写法是等价的。
int const (*p)
const int (*p)
int const *p
常数int *p
三、int*const p
那么如何声明一个人是const pointer呢?方法是让const尽量接近p,下面一个是
int main() {
int a=10
int b=20
int * const p=a;
printf('%d\n ',* p);
返回0;
}
指针只能指向A,指向B会出错。该地址只能分配一次。
这里有一个简单的区分方法:沿着*号画一条线。如果const在*的左边,const用来修改指针指向的变量,即指针指向一个常数。如果const在*的右边,const用来修改指针本身,也就是指针本身是一个常数。
四、const用于函数的地址传递参数
void func(const int * p);
这种形式通常用于通过参数数组中的值来模拟调用。这相当于函数调用方声称,'我给你一个指向它的指针,但你不能修复它。'如果函数编写器遵循这个约定,就相当于模拟了值的传递。这也是const最有用的地方:用来限定函数的形参,这样函数就不会修改实参指针所指向的数据。这里注意是函数不应该修改而不是不能修改,也就是说const不能阻止参数的修改(原因见上)。
关于C语言中const用法的详细讲解,本文就到这里了。更多C语言中const的相关内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。