,,C语言详细讲解const的用法

,,C语言详细讲解const的用法

今天讨论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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: