CONST

C语言中const关键字的理解与应用

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。另外CONST在其他编程语言中也有出现,如C++、PHP5、C#.net、HC08 C。

问题1:const变量&常量

例:为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? 

  const int n = 5;

  int a[n];

  答案与分析:

  1)这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的,“常量”不等于“不可变的变量”。

  2)但是在标准C++中,这样定义的是一个常量,这种写法是对的。实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它(实际上用GCC或VS2005编译以上代码,确实没有错误产生,也没有给出警告)。

  3)那么,在ANSI C中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

问题2:const限定内容

 例:下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢? 

  typedef char * pStr;

  char string[4] = "abc";

  const char *p1 = string; //1式

  const pStr p2 = string; //2式

  p1++;

  p2++;

  答案与分析:

  问题出在p2++上。

  1)const使用的基本形式: const type m;

  限定m不可变。

  2)替换基本形式中的m为1式中的*p1,替换后const char *p1;

  限定*p1不可变,当然p1是可变的,因此问题中p1++是对的。

  3)替换基本形式中的type为2式中的pStr,替换后const pStr m;

  限定m不可变,题中的pStr就是一种新类型,因此问题中p2不可变,p2++是错误的。

问题3:const & 指针

例一:

  下面分别用const限定不可变的内容是什么?

  1)const在前面

  const int nValue; //nValue是const

  const char *pContent; //*pContent是const, pContent可变

  const char* const pContent; //pContent和*pContent都是const

  2)const在后面,与上面的声明对等

  int const nValue; //nValue是const

  char const * pContent; //*pContent是const, pContent可变

  char* const pContent; //pContent是const,*pContent可变

  char const* const pContent; //pContent和*pContent都是const

  答案与分析:

  const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面讲一下我的判断原则:

  const只修饰其后的变量,至于const放在类型前还是类型后并没有区别。如:const int a和int const a都是修饰a为const。*不是一种类型,如果*pType之前是某类型,那么pType是指向该类型的指针

  一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。[1]

例二:

  int const * p1,p2;

  p2是const;(*p1)是一整体,因此(*p1)是const,但p1是可变的。int * p1,p2只代表p1是指向整型的指针,要表示p1、p2都是指针是需写成int * p1,* p2。所以无论是* const p1,p2还是const * p1,p2,里面的*都是属于p1的。

例三:

  int const * const p1,p2;

  p2是const,是前一个const修饰的,*p1也被前一个const修饰,而p1被后一个const修饰。

例四:

  int * const p1,p2;

  p1是const,(* const p1)是整体,所以const不修饰p2。

例五:

  指针指向及其指向变量的值的变化

  const在*的左边,则指针指向的变量的值不可变;在*的右边,则指针的指向不可变。简记为“左定值,右定向”。

  1)指针指向的变量的值不能变,指向可变

  int x = 1;

  int y = 2;

  const int* px = &x;  int const* px = &x;

//这两句表达式一样效果

  px = &y; //正确,允许改变指向

  *px = 3; //错误,不允许改变指针指向的变量的值

  2)指针指向的变量的值可以改变,指向不可变  

  int x = 1;

  int y = 2;

  int* const px = &x;  

  px = &y; //错误,不允许改变指针指向

  *px = 3; //正确,允许改变指针指向的变量的值

  3)指针指向的变量的值不可变,指向不可变  

  int x = 1;

  int y = 2;

  const int* const px = &x;  int const* const px = &x;  

  px = &y; //错误,不允许改变指针指向

  *px = 3; //错误,不允许改变指针指向的变量的值

补充

  在c中,对于const定义的指针,不赋初值编译不报错,

  即int* const px;等不会报错。

  但是,在C++中

  int* const px;和const int* const px;会报错,const int* px;不报错。

  必须初始化指针的指向int* const px = &x;const int* const px=&x;

  强烈建议在初始化时说明指针的指向,防止出现野指针!

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试同场景以深入理解算法行为与系统鲁棒性。
10-12
const 是 "constant" 的缩写,意思是永恒变的,它是定义只读变量或常变量的关键字 [^1]。 在 C++11 中,const 用于定义常量类型,可应用于变量、指针和函数参数,根据应用位置同,分为顶层 const 和底层 const [^2]。在 C/C++ 里,const 关键字用于定义常量,其位置决定了是修饰指针本身还是指针所指向的值 [^4]。 const 的使用方法包括以下几种情况: - **修饰变量**:定义只读变量,如 `const int num = 10;`,此时 `num` 的值能被修改 [^1]。 - **修饰指针**: - `const int *`:指向常量整数的指针,允许通过指针修改所指向的值,例如: ```c++ const int a = 10; const int *ptr = &a; // *ptr = 20; // 错误,能通过指针修改所指向的值 ``` - `int * const`:常量指针,指针本身是常量,允许重新指向其他地址,但可以通过指针修改所指向地址的值,例如: ```c++ int b = 10; int * const ptr2 = &b; *ptr2 = 20; // 可以修改所指向地址的值 // ptr2 = &a; // 错误,能重新指向其他地址 ``` - **修饰函数参数**:在函数参数中使用 const 可以防止函数内部修改传入的参数值,例如: ```c++ void func(const int param) { // param = 20; // 错误,修改 param 的值 } ``` const 具有以下特点: - **常变量特性**:说 const 定义的是变量,但又相当于是常量;说它定义的是常量,但它又有变量的特点,所以称作常变量 [^1]。 - **类型检查**:const 常量是有类型的,编译器可以进行安全检查,与 `#define` 相比,`#define` 只能进行简单的字符串替换,能进行安全检查。const 定义的变量类型,只有整数或者枚举,且以常量表达式初始化时,才能作为常量表达式,其他情况下被 const 修饰,只是用来限定,能与常量混淆 [^3]。 - **只读性**:const 最主要的特点就是只读,有常量、常量指针等形式,如果仔细分析 C 语言语句的书写格式,再加上指针的使用,就特别容易弄错 [^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值