C语言中const与指针的相爱相杀

本文详细解析了C++中const限定符与指针结合使用时的不同情况,包括常量指针、指针常量以及同时限制指针和所指数据的用法,帮助读者理解并掌握const修饰指针的规则。

const修饰指针——常量指针

const int *p = &a;

此时经过const修饰之后,指针就如束缚了手,不能改变它所指向地址的数据了,但是它还是有脚的,还是可以跑得,所以此时指针可以指向其他地址。

      //*p = 10; //这个不行
      p = &b; //这个可以有

const修饰常量——指针常量

int* const p = &a;

此时经过const修饰之后,指针就如束缚了脚,不能指向其他地址,但是它还是有手的,可以改变它所指向地址的数据。

   *p = 10; //这个可以有
   //p = &b; //这个不行

const又修饰指针又修饰常量

const int * const p = &a;

此时经过const修饰,指针手脚都被束缚,既不能改变指向,又不能修改所指向地址的数据。

  //*p = 10;//这个不行
  //p = &b; //这个也不行

如果上面的方法不能记住,那么我们在换一个方法

看见这个

const int *p = &a

你就死记硬背,看见 *p , *p 是干什么的,一般是 *p = 10,那么加了const,就不能这样做了,所以你看见 const int *p = &a,就知道不能改值,只能改指向。就反着记。
相反的

int *const p = &a;

一般 p = &b ,那么加了const,就不能这样做了。也是反着记。

总结
const后面接p,就不能p = &a;const后面接 *p,就不能 *p = 10;

潮汐研究作为海洋科学的关键分支,融合了物理海洋学、地理信息系统及水利工程等多领域知识。TMD2.05.zip是一套基于MATLAB环境开发的潮汐专用分析工具集,为科研人员工程实践者提供系统化的潮汐建模计算支持。该工具箱通过模块化设计实现了两大核心功能: 在交互界面设计方面,工具箱构建了图形化操作环境,有效降低了非专业用户的操作门槛。通过预设参数输入模块(涵盖地理坐标、时间序列、测站数据等),用户可自主配置模型运行条件。界面集成数据加载、参数调整、可视化呈现及流程控制等标准化组件,将复杂的数值运算过程转化为可交互的操作流程。 在潮汐预测模块中,工具箱整合了谐波分解法潮流要素解析法等数学模型。这些算法能够解构潮汐观测数据,识别关键影响要素(包括K1、O1、M2等核心分潮),并生成不同时间尺度的潮汐预报。基于这些模型,研究者可精准推算特定海域的潮位变化周期振幅特征,为海洋工程建设、港湾规划设计及海洋生态研究提供定量依据。 该工具集在实践中的应用方向包括: - **潮汐动力解析**:通过多站点观测数据比对,揭示区域主导潮汐成分的时空分布规律 - **数值模型构建**:基于历史观测序列建立潮汐动力学模型,实现潮汐现象的数字化重构预测 - **工程影响量化**:在海岸开发项目中评估人工构筑物对自然潮汐节律的扰动效应 - **极端事件模拟**:建立风暴潮天文潮耦合模型,提升海洋灾害预警的时空精度 工具箱以"TMD"为主程序包,内含完整的函数库示例脚本。用户部署后可通过MATLAB平台调用相关模块,参照技术文档完成全流程操作。这套工具集将专业计算能力人性化操作界面有机结合,形成了从数据输入到成果输出的完整研究链条,显著提升了潮汐研究的工程适用性科研效率。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### C语言 `const` 修饰指针的用法及案例分析 #### 1. 基础概念 在C语言中,`const` 关键字用于定义常量,当它指针结合时,可以根据其位置不同来限制指针的行为。具体来说,`const` 可以用来修饰指针本身或者指针所指向的数据。 --- #### 2. 不同场景下的 `const` 修饰指针 ##### (1) **仅修饰指针指向的内容** 如果 `const` 出现在 `*` 的左侧,则表示该指针指向的内容是只读的,无法通过此指针修改其所指向的值[^1]。 ```c int a = 10; const int *p = &a; // const 在 * 左侧,说明 p 指向的内容不可修改 *p = 20; // 错误:不能通过 p 修改 a 的值 ``` 在这种情况下,虽然指针指向的内容不可变,但指针本身的值是可以改变的: ```c int b = 30; p = &b; // 正确:允许更改指针指向其他变量 printf("%d\n", *p); // 输出 30 ``` --- ##### (2) **仅修饰指针本身** 如果 `const` 出现在 `*` 的右侧,则表示指针本身是一个常量,不允许重新赋值给另一个地址[^2]。 ```c int a = 10, b = 20; int * const p = &a; // const 在 * 右侧,说明指针本身不可修改 p = &b; // 错误:不能更改指针指向的地址 *a = 30; // 正确:可以通过解引用操作符修改 a 的值 printf("%d\n", *p); // 输出 30 ``` 在这里,尽管指针本身不可变,但它指向的内容却是可写的。 --- ##### (3) **同时修饰指针及其指向的内容** 如果 `const` 同时出现在 `*` 的两侧,则既限制了指针指向的内容不可写入,也限制了指针本身不可重定向[^3]。 ```c int a = 10; const int * const p = &a; // const 修饰 * 变量 *p = 20; // 错误:不能修改指针指向的内容 p = NULL; // 错误:不能修改指针自身的值 ``` 这种形式通常用于保护数据的安全性一致性,在某些特定场合下非常有用。 --- #### 3. 实际应用案例 以下是几个实际应用场景的例子: ##### (1) **函数参数传递中的保护机制** 为了防止函数内部意外修改传入的指针或其指向的数据,可以使用 `const` 进行约束。 ```c void printArray(const int *arr, size_t length) { for (size_t i = 0; i < length; ++i) { printf("%d ", arr[i]); } } int main() { int array[] = {1, 2, 3}; printArray(array, sizeof(array)/sizeof(int)); } ``` 在这个例子中,`printArray` 函数接收了一个 `const int *` 类型的参数,表明不会对该数组进行任何修改。 --- ##### (2) **返回局部静态变量的指针** 有时我们需要从函数中返回一个指针,为了避免调用者修改原始数据,可以用 `const` 来限定返回值。 ```c const char *getGreeting() { static const char greeting[] = "Hello"; return greeting; } int main() { const char *msg = getGreeting(); msg[0] = 'h'; // 编译错误:试图修改只读字符串 } ``` 这里返回的是一个 `const char *`,确保外部代码无法篡改原字符串。 --- ##### (3) **多重指针的情况** 对于更复杂的结构,比如双重指针或多层嵌套,也可以利用 `const` 提供额外保障。 ```c int value = 42; const int *ptr1 = &value; // ptr1 是指向 const 数据的指针 const int **ptr2 = &ptr1; // ptr2 是指向 const 指针指针 **ptr2 = 99; // 错误:尝试修改 const 数据 (*ptr2)[0] = 88; // 错误:同样违反 const 约束 ``` --- ### 总结 通过对 `const` 放置位置的不同组合,可以在多种层面实现对指针行为的有效控制。这不仅有助于提高程序安全性,还能增强代码的可维护性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值