前言

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的更多相关文章

  1. *C语言有关指针的变量声明中的几个易错点

    转至:http://my.oschina.net/ypimgt/blog/108265   Technorati 标签:  指针, typedef, const, define 我们都知道,至少听说过 ...

  2. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  3. c++中的const参数,const变量,const指针,const对象,以及const成员函数

    const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...

  4. C++中使用const修饰指针

    在本文中呢,主要讲解四个方面,即:常量数据的与否和常量指针的与否中const如何对指针进行修饰: 1.指向非常量数据的常量指针 对于一个指向非常量数据的常量指针,我们应该清楚的知道,在这我们注重的是指 ...

  5. 为什么C/C++语言使用指针

    这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...

  6. [C语言]进阶|指针与字符串

    ------------------------------------------------------------------------------------ 回顾:[C语言]指针与字符串 ...

  7. C语言07指针高级

    01内存四区 接口封装和设计思想引导 接口封装设计思想引导 Sckclient客户端api模型设计 第一套api函数 #ifndef _SCK_CLINT_H_ #define _SCK_CLINT_ ...

  8. 【C语言】-指针和字符串

    本文目录 字符串回顾 一.用指针遍历字符串的所有字符 二.用指针直接指向字符串 三.指针处理字符串的注意 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速 ...

  9. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  10. go语言之指针

    package main import "fmt" //指针 //go语言的指针是非常容易学习的,比c中容易很多,他可以更简单的执行一些任务 //与变量类型,使用前需要定义 fun ...

随机推荐

  1. LINUX经常使用的命令详解

    LINUX经常使用的命令详解 源地址:http://blog.itpub.net/29065182/viewspace-1189162/ 1.man 对你熟悉或不熟悉的命令提供帮助解释  eg:man ...

  2. 飞行时间技术TOF

    文章目录 飞行时间技术TOF 一. 光速的测定 二. 各种TOF技术 直接脉冲TOF 脉冲间接TOF 连续波调制TOF(Continous Wave TOF) 三. TOF技术的应用 飞行时间技术TO ...

  3. [C++提高编程] 3.8 set/ multiset 容器

    文章目录 3.8 set/ multiset 容器 3.8.1 set基本概念 3.8.2 set构造和赋值 3.8.3 set大小和交换 3.8.4 set插入和删除 3.8.5 set查找和统计 ...

  4. RocketMQ的简单使用

    大家好,我是Leo!今天来和大家分享RocketMQ的一些用法. 领域模型介绍 Producer: 用于生产消息的运行实体. Topic: 主题,用于消息传输和存储的分组容器. MessageQueu ...

  5. 如何用 KMP 偏序 Z 函数

    KMP 算法求解字符串匹配的过程中 \(next\) 数组有着繁多的应用,主要是可以帮我们求 border. 然而用 \(s\) 串匹配 \(t\) 串产生的 \(f\) 数组应用相对较少. \(f\ ...

  6. Apache hudi 核心功能点分析

    Hudi 文中部分代码对应 0.14.0 版本 发展背景 初始的需求是Uber公司会有很多记录级别的更新场景,Hudi 在Uber 内部主要的一个场景,就是乘客打车下单和司机接单的匹配,乘客和司机分别 ...

  7. 2023-03-30:用Go语言改写FFmpeg示例decode_audio.c,实现高效音频解码。

    2023-03-30:用Go语言改写FFmpeg示例decode_audio.c,实现高效音频解码. 答案2023-03-30: 这个程序的主要功能是将 MP2 音频文件解码为 PCM 格式,并输出到 ...

  8. 2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合。 返回有几个回文子串。 来

    2022-07-21:给定一个字符串str,和一个正数k, 你可以随意的划分str成多个子串, 目的是找到在某一种划分方案中,有尽可能多的回文子串,长度>=k,并且没有重合. 返回有几个回文子串 ...

  9. 2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x, x的价值是x的不同质因子的数量。 返回所有选择数字的方案中,得到的x的价值之和。 来自携程。

    2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x, x的价值是x的不同质因子的数量. 返回所有选择数字的方案中,得到的x的价值之和. 来自携程. 答案2022-0 ...

  10. 2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系

    2022-04-21:给定一个包含 [0,n) 中不重复整数的黑名单 blacklist, 写一个函数从 [0, n) 中返回一个不在 blacklist 中的随机整数, 对它进行优化使其尽量少调用系 ...