前言

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. Zabbix - 部署随笔

    部署Zabbix服务端 准备机器,初始化环境 #查看IP地址 [root@Minimal ~]# ifconfig ens33 | awk 'NR==2{print $2}' 10.0.0.243 # ...

  2. Junit启动测试mybatis xml文件BindingException: Invalid bound statement问题

    背景:1.正常启动,xml文件放在java目录和resource目录下均正常 2.junit启动,xml文件放在resource目录下正常,放在java目录下报BindingException错误 m ...

  3. SQL server数据库拼接语句(STUFF)用法

    我对SQLserver 中STUFF函数的理解是在sql server中将字符串中的第一个字符串某一部分字符替换成另外一部分,组成新的字符串数据. STUFF(character_expression ...

  4. [C++提高编程] 2、STL初识

    文章目录 2 STL初识 2.1 STL的诞生 2.2 STL基本概念 2.3 STL六大组件 2.4 STL中容器.算法.迭代器 2.5 容器算法迭代器初识 2.5.1 vector存放内置数据类型 ...

  5. 驱动开发:通过MDL映射实现多次通信

    在前几篇文章中LyShark通过多种方式实现了驱动程序与应用层之间的通信,这其中就包括了通过运用SystemBuf缓冲区通信,运用ReadFile读写通信,运用PIPE管道通信,以及运用ASYNC反向 ...

  6. MySQL WorkBench更换界面成中文的方法

    菜单页面更换 文章目录 菜单页面更换 汉化文件的xml文件我放在下面的网盘中了 1.找到MySQL的安装位置, 总结 汉化文件的xml文件我放在下面的网盘中了 1.找到MySQL的安装位置, 具体安装 ...

  7. OData WebAPI实践-Non-EDM模式

    前文说到了 EDM 与 OData 之间的关系,具有 EDM 的 OData 提供了强大的查询能力,但是 OData 并不必须要配置 EDM,我们也可以使用 Non-EDM 方案. Non-EDM 所 ...

  8. Selenium - 元素定位(2) - XPATH进阶

    Selenium - 元素定位 XPATH 定位进阶 元素示例 属性定位 # xpath 通过id属性定位 driver.find_element_by_xpath("//*[@id='kw ...

  9. GitHub上SSH keys和Deploy keys的区别

    平时安装一个git然后去GitHub进行SSH keys 配置最后就开始使用,然后换一台电脑再使用$ ssh-keygen -t rsa -C "your email"生成一个ss ...

  10. 一文教会你用Apache SeaTunnel Zeta离线把数据从MySQL同步到StarRocks

    在上一篇文章中,我们介绍了如何下载安装部署SeaTunnel Zeta服务(3分钟部署SeaTunnel Zeta单节点Standalone模式环境),接下来我们介绍一下SeaTunnel支持的第一个 ...