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 ...
随机推荐
- 【LeetCode动态规划#08】完全背包问题实战与分析(零钱兑换II)
零钱兑换II 力扣题目链接(opens new window) 给定不同面额的硬币和一个总金额.写出函数来计算可以凑成总金额的硬币组合数.假设每一种面额的硬币有无限个. 示例 1: 输入: amoun ...
- AndroidApp加密数据明文抓取测试方法——hook方式
0x00 前言 在做移动安全的app渗透或者说移动app的漏洞挖掘时,往往会碰到一种情况:好不容易绕过了app的反抓包机制,通过burp抓到了app传输的数据包,这时想对这部分数据做一些爆破.篡改之类 ...
- springboot升级过程中踩坑定位分析记录 | 京东云技术团队
作者:京东零售 李文龙 1.背景 " 俗话说:为了修复一个小bug而引入了一个更大bug " 因所负责的系统使用的spring框架版本5.1.5.RELEASE在线上出过一个偶发的 ...
- 2022-09-18:以下go语言代码输出什么?A:1;B:15;C:panic index out of range;D:doesn’t compile。 package main import
2022-09-18:以下go语言代码输出什么?A:1:B:15:C:panic index out of range:D:doesn't compile. package main import ( ...
- 2020-12-24:MQ中,如何保证消息不丢失?
福哥答案2020-12-24: 生产者丢失消息:如网络传输中丢失消息.MQ 发生异常未成功接收消息等情况. 解决办法:主流的 MQ 都有确认或事务机制,可以保证生产者将消息送达到 MQ.如 Rabbi ...
- 2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系
2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系 ...
- 2021-03-11:go中,协程内部再启用协程,它们是没关系,对吧?外部协程奔溃,内部协程还会执行吗?外部协程执行结束的时候,如何让内部协程也停止运行?golang原生提供的包里,让内部协程停止运行,如何实现?
2021-03-11:go中,协程内部再启用协程,它们是没关系,对吧?外部协程奔溃,内部协程还会执行吗?外部协程执行结束的时候,如何让内部协程也停止运行?golang原生提供的包里,让内部协程停止运行 ...
- 开发者一定要知道的 API 管理五大趋势
API First 大势所趋,APIaaS(API 作为服务)也将受到越来越多企业和组织的选择,研发团队对 API 研发管理工具的要求也水涨船高. API 在今天的数字化世界中扮演着至关重要的角色,随 ...
- .NET 通过源码深究依赖注入原理
依赖注入 (DI) 是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性.在日常工作中,我们一定遇见过这些问题或者疑惑. Singleton服 ...
- SpringMVC 简单的开始
SpringMVC简单的开始 利用Spring模板配置写一个web项目. 1.核心配置文件(模板代码) <?xml version="1.0" encoding=" ...