转载:https://mp.weixin.qq.com/s?__biz=Mzk0NDYzNTI1Ng==&mid=2247483733&idx=1&sn=9af9bc64a0ba45e4a782a53622ab4f51&chksm=c320ed42f4576454a5972d7bfa779468c370a4652d34f1087587f9e42a06db19d2e5d27df6b7#rd

const和C指针

众所周知,C中可以使用const来声明常量,即限定变量的值不可以修改。

当把const用在指针上面的时候,他有两个左右:

  1. 指针本身不能修改
  2. 指针指向的值不能被修改

修改指针和修改指针的值的区别

int main(){
int a = 10, c = 10, *b = &a;
b = &c; // 这一步叫做修改指针
*b = 20 // 这一步叫修改指针的值
}

const在指针的用法

如下,定义一个指针为:int * const a表示指针a本身不可以被修改,但指针a指向的值可以被修改:

int num = 10, num2 = 30;
int * const a = #
*a = 20; // 这一步操作是合法的
a = &num2; // 这一步操作是非法的

如下,定义一个指针为:int const * a表示指针a本身可以被修改,但指针a指向的值不可以被修改:

int num = 10, num2 = 30;
int const *a = #
a = &num2; // 这一步操作是合法的
*a = 20; // 这一步操作是非法的

若把以上两种形式合在一起,也就是定义一个指针为:int const * const a,则指针a本身和其指向的值都是不可以被修改的。

int num = 10, num2 = 30;
int const * const a = #
a = &num2; // 这一步操作是非法的
*a = 20; // 这一步操作是非法的

使用强制类型转换

当我们使用强制类型转换的时候,可以强制修改一些东西。

int num = 10, num2 = 30;
int const * a = #
a = &num2; // 这一步操作是非法的
*a = 20; // 这一步操作是非法的 int *b = (int *)a
*b = 20; // 这一步操作是合法的

通常这种操作没有意义。

const的位置

值得注意的是,const int *a和int const *a是完全一样的。

当的同一行定义多个变量的是后:

int const *a, *b, c;

是等价于

int const *a;
int const *b;
int const c;

即所有的部分都定义为了const,表示a和b指向的值不能改,c的值不能该。

同理,

const int *a, *b, c;

是等价于

const int *a;
const int *b;
const int c;

该定义效果是等价于int const *a, *b, c的。

若是如下形式:

int *const a, *b, c;

则是等价于

int *const a;
int *b;
int c;

const只对a生效,对b和c是不生效的。

总结

const在*前面表示该指针的值不能被修改,在*后面表示该指针本身不能被修改。

const和C指针的更多相关文章

  1. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  2. const typedef 和指针的问题(这里必须初始化的才初始化了,不必须的则没有初始化)

    这里很容易搞混: tyepdef double dou;//这里是dou是double的别名 #include<iostream> using namespace std; int mai ...

  3. const对象,指向const对象的指针 和 const 指针

    const对象: const对象声明时必须赋初值,该值在编译阶段确定,不可在程序中修改. const修饰符既可放在类型名前也可放在类型名后,通常放在类型名前.不过放在类型名后易于理解. const i ...

  4. C++中的error C2662,const的this指针问题

    今天在写C++代码的时候遇到一个错误,涉及到了常量的this指针的问题. 简化后的代码如下: #include <iostream> #include <string> usi ...

  5. oc const 关键字 对指针的理解

    /* int const *p; *p是常量, p是变量 const int *p; *p是常量, p是变量 int * const p; *p是变量, p是常量 const int * const ...

  6. const引用和指针

    1.可以为const引用初始化一个非const的对象.字面值,甚至是一般表达式. 2.对引用初始化时必须严格进行类型匹配,但是const引用初始化时不需要类型匹配,只要可以转换为const所定义的类型 ...

  7. const关键字与指针

    const与指针在一起的几种情况. const int *p1; //表示p1本身不是const,指向的变量是const. const *int p2; //语法错误 int const *p3; / ...

  8. const变量指针赋值给非const类型的指针运行结果

    在c++可以定义一个const变量,然后把变量的值赋给一个非const指针,可以通过指针来改变const变量的值吗?下面的截图给出了答案

  9. c++引用和const 用法 数组 指针

    非const引用,只能用object为其赋值: <c++primer>P52 而const引用则可以用临时变量为其赋值: 如: const int &r = 32://可以 int ...

  10. const变量通过指针修改问题

    const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1. 不能修改的情况 #include int const a = 10; void ma ...

随机推荐

  1. Python爬虫如何使用代理IP进行抓取

    前言 Python爬虫是一种非常强大的工具,可以用于抓取各种网站的数据.但是,在一些情况下,我们需要使用代理IP来完成数据抓取,如绕过IP限制或保护隐私信息等.本文将介绍如何使用Python爬虫抓取数 ...

  2. warning in ./src/router/index.js (Emitted value instead of an instance of Error) Error compiling template: Uncaught (in promise) TypeError: Cannot set properties of undefined (setting 'jsoninfo'

    目录 warning in ./src/router/index.js (Emitted value instead of an instance of Error) Error compiling ...

  3. golang Context应用举例

    Context本质 golang标准库里Context实际上是一个接口(即一种编程规范. 一种约定). type Context interface { Deadline() (deadline ti ...

  4. C#学习笔记--进阶

    C#进阶 简单数据结构类 ArrayList 元素类型以Object类型存储,支持增删查改的数组容器. 因而存在装箱拆箱操作,谨慎使用. //ArrayList ArrayList array=new ...

  5. SqlServer的执行计划如何分析?

    sqlserver的执行计划 执行计划是 SQL Server 中的一个重要工具,用于分析和优化查询的性能.它提供了关于查询的详细信息,包括查询的执行顺序.使用的索引.连接类型.过滤条件等. What ...

  6. Building Bridges 题解

    Building Bridges 题目大意 连接两根柱子 \(i,j\) 的代价是 \((h_i-h_j)^2+\sum\limits_{k=j+1}^{i-1}w_k\),连接具有传递性,求将 \( ...

  7. java后端操作树结构

    一.树结构的三种组装方式(递归.双层for循环,map) (1)递归 普通递归方法 public Result getBmsMenuList(UserSessionVO userSessionInfo ...

  8. 揭秘计算机奇迹:探索I/O设备的神秘世界!

    引言 在之前的章节中,我们详细讲解了计算机系统中一些核心组成部分,如中央处理器(CPU).内存.硬盘等.这些组件负责处理和存储数据,使得计算机能够有效地运行.然而,除了这些核心组件,计算机系统还包含许 ...

  9. umich cv-6-1 循环神经网络基本知识

    这节课中介绍了循环神经网络的第一部分,主要介绍了循环神经网络的基本概念,vanilla循环网络架构,RNN的一些应用,vanilla架构的问题,更先进的rnn架构比如GRU和LSTM 循环神经网络基本 ...

  10. LAMP配置与应用

    LAMP配置与应用 1.1 动态资源和语言 WEB 资源类型: 静态资源:原始形式与响应内容一致,在客户端浏览器执行 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端 ...