C语言指针--指针中的const
文章目录
前言
var code = “47f56ed3-1701-4c13-a755-19dd0f5d101e”
这一章讲一个对指针和 const 之间的结合。
一、const
1.什么是const
const是C语言中的一种修饰符,和宏定义一样,只要定义了该变量就不能再改变了。
2.const的使用
const type variate = value;
- type:类型
- variate:变量名
- value:值
被 const 修改后的变量的值不能对它在进行赋值了,例如下面的代码
#include <stdio.h>
int main(){
const int a = 5;
a = 6;
return 0;
}
编译后

可以发现没有办法对被 const 修饰后的变量进行修改。
二、const修饰一级指针
const 放在变量中是很简单的,如果将 const 放在指针中的情况会很复杂,现在来一一讲解。
1.const放在 * 左边
#include <stdio.h>
int main(){
int a = 5, b = 10;
const int* pa = &a;
return 0;
}
这种情况是让指针变量pa中的内容不改变,而地址可以改变。
比如对pa的地址进行改变
#include <stdio.h>
int main(){
int a = 10, b = 20;
const int* pa = &a;
pa = &b;
printf("%d\n", *pa);
return 0;
}
运行的结果

如果对pa地址对应的内容进行修改
#include <stdio.h>
int main(){
int a = 10, b = 20;
const int* pa = &a;
*pa = b;
printf("%d\n", *pa);
return 0;
}
会出现错误

所以当const放在*左边时,只能对指针变量存放的地址进行修改,但不能对地址对应内容呢进行修改。
2.const在*右边
#include <stdio.h>
int main(){
int a = 5, b = 10;
int* const pa = &a;
return 0;
}
还是和上面的使用一样
重新赋值内容
#include <stdio.h>
int main(){
int a = 5, b = 10;
int* const pa = &a;
pa = &b;
return 0;
}
会发现没法通过编译,因为 const 在 * 的右边是修饰指针变量的,让指针变量里面的内容不发生改变

三、const修饰二级指针
1.const修饰**前
#include <stdio.h>
int main(){
int a = 5, b = 10;
int* pa = &a;
int* pb = &b;
const int ** ppa = &pa;
**ppa = 28;
return 1;
}
const 修饰在 ** 前修饰的内容是 **ppa ,也就是 **ppa 中所对应的内容不会被修改,所以第7行语句会报一个错误

但这里会发现存在一个警告,因为二级指针中的一级指针不是使用 const 的进行修饰,所以为了解决这个问题,需要在一级指针前面添加一个 const 进行修饰。
#include <stdio.h>
int main(){
int a = 5, b = 10;
const int* pa = &a;
int* pb = &b;
const int ** ppa = &pa;
**ppa = 28;
return 1;
}
这样就不存在警告了。
2.const修饰**中间
#include <stdio.h>
int main(){
int a = 5, b = 10;
int* pa = &a;
int* pb = &b;
int * const * ppa = &pa;
*ppa = &b;
return 1;
}
const 修饰在 ** 中间,本质上修饰 *ppa 中的内容,如果改变 *ppa 中存放的地址,会报错

3.const修饰**右边
#include <stdio.h>
int main(){
int a = 5, b = 10;
int* pa = &a;
int* pb = &b;
int** const ppa = &pa;
ppa = &pb;
return 1;
}
这修饰的是 ** 右边的内容,也就是修饰 ppa ,所以 ppa 中的内容是不能被修改的

总结
const 对于指针的修饰情况有很多,级数越高的指针,产生的全款就会越多,所以一般都只考虑 const 到二级指针的情况,更高级的指针不会考虑。
C语言指针--指针中的const的更多相关文章
- *C语言有关指针的变量声明中的几个易错点
转至:http://my.oschina.net/ypimgt/blog/108265 Technorati 标签: 指针, typedef, const, define 我们都知道,至少听说过 ...
- C语言结构体中的函数指针
这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...
- c++中的const参数,const变量,const指针,const对象,以及const成员函数
const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...
- C++中使用const修饰指针
在本文中呢,主要讲解四个方面,即:常量数据的与否和常量指针的与否中const如何对指针进行修饰: 1.指向非常量数据的常量指针 对于一个指向非常量数据的常量指针,我们应该清楚的知道,在这我们注重的是指 ...
- 为什么C/C++语言使用指针
这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...
- [C语言]进阶|指针与字符串
------------------------------------------------------------------------------------ 回顾:[C语言]指针与字符串 ...
- C语言07指针高级
01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_ ...
- 【C语言】-指针和字符串
本文目录 字符串回顾 一.用指针遍历字符串的所有字符 二.用指针直接指向字符串 三.指针处理字符串的注意 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速 ...
- C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数
1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...
- go语言之指针
package main import "fmt" //指针 //go语言的指针是非常容易学习的,比c中容易很多,他可以更简单的执行一些任务 //与变量类型,使用前需要定义 fun ...
随机推荐
- JavaFx 实现水平滚动文本(跑马灯效果)
原文地址: JavaFx 实现水平滚动文本(跑马灯效果) - Stars-One的杂货小窝 本文是以TornadoFx框架进行编写,各位使用JavaFx可以参考 代码已经封装在common-contr ...
- C# 打开蓝牙设置界面
蓝牙设置相关界面,以下是通过C#方式打开的几个方式,记录一下 蓝牙设置界面 1.控制面板命令bthprops.cpl 可以用控制面板 control+bthprops.cpl,也可以直接bthprop ...
- [C++基础入门] 5、 数组
文章目录 5 数组 5.1 概述 5.2 一维数组 5.2.1 一维数组定义方式 5.2.2 一维数组数组名 5.2.3 冒泡排序 5.3 二维数组 5.3.1 二维数组定义方式 5.3.2 二维数组 ...
- Prism Sample 21-PassingParameters
这个例子是说明导航中传递参数,类似Asp.net中实现. 例子的模板,是例16中使用regionContext实现过的.在例16中, <Grid x:Name="LayoutRoot& ...
- LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天下午有力扣杯战队赛,不知道官方是不是故意调低早上周赛难度给选手们练练手. 往期周赛回 ...
- 问题解决:TNS-12543: TNS:destination host unreachable
环境: 11.2.0.3 ADG (db11g\db11gadg\db11gcas) 在自己先前克隆后的环境互相tnsping报错. tnsping 本机ok,tnsping其他机器均报错: [ora ...
- drf——序列化之source(了解)、定制字段的两种方式(重要)、多表关联反序列化保存、反序列化字段校验、ModelSerializer使用
1 序列化高级用法之source(了解) # 1.创建了5个表(图书管理的5个) # 2.对book进行序列化 # 总结:source的用法 1.修改前端看到的字段key值--->source指 ...
- 关于SpringBoot AutoConfiguration
(1)如何导入的自动配置类 首先我们得从@SpringBootApplication注解入手. @SpringBootApplication public class SpringBootDemoAp ...
- linux 管理进程和计划任务
目录 一.进程原理 二.进程工作过程 三.进程类型 四.管理进程 五.前后台调度 六.定时任务 七.管理定时任务 一.进程原理 进程:指正在运行的程序称之为进程 程序:指的是没有运行的代码 线程:真正 ...
- Github疯传!谷歌师兄的LeetCode刷题笔记开源了!
有小伙伴私聊我说刚开始刷LeetCode的时候,感到很吃力,刷题效率很低.我以前刷题的时候也遇到这个问题,直到后来看到这个谷歌师兄总结的刷题笔记,发现LeetCode刷题都是套路呀,掌握这些套路之后, ...