const在c与c++的区别与使用

大学期间对c和c++的了解太少了,现在工作了导致自己来恶补,简单的const关键字里面的学问还是挺大的,越是基础的知识越是容易忘却,所以今天开始记录着自己每一天的学习结果。

1.在c语言中const

在C语言中 const关键字用来修饰变量名为只读,仅此而已。

也就是说通过变量名不可以修改它的值,但是可以通过得到它的地址来修改他的值。

#include<stdio.h>
int main(){
const int a = 10;
int *p = (int *)&a;
*p = 20;
printf("a = %d\n",a);
return 0;
}

同时被const修饰的全局变量也就是外连接,其他源文件要引用只需要加上extern即可。

被const修饰的全局变量不能以地址的形式进行修改,由于它在内存中位于常量区,他的地址空间是只读的。在C语言中被const的变量是直接被分配内存的。

2.c++中的const

2.1 c++中const的使用

c++中 const关键字被用来表示常量,和#define的作用一样。

在C++中能否通过地址来改变它的值,取决于是否给他分配了内存。主要分以下三中情况

1、const int a = 10;

这种情况是不分配内存的,直接被写在符号表中,即使后面被分配了内存,那么a的值也不会被改变,输出的值一直都是符号表中的值

 ```
#include<iostream>
int main(){
const int a = 10;
std::cout << "original a =" << a << std::endl; int *p = (int *)&a;
*p = 200;
std::cout << "*p =" << *p << std::endl; std::cout << "last a =" << a << std::endl;
return 0;
}
```

测试结果如下图所示:

2、int b =100;

const int a = b;

3、const person per ={"name","id"}

2和3这种情况都是直接分配内存的,并不会被写在符号表中,它的值是可以通过地址访问的方式来改变的。

2.2 c++中const的使用建议

在c++中尽量将宏定义#define 替换为 const

由于#define在编译的预处理阶段就替换为相对应的常量,假如 #define Max 1024; 那么我们在由于这发生错误,他只会提示1024出现错误,

而我们换成const int Max = 1024;系统就会提示我们这一行发生了错误,并且定义到相对应的行。

2.3 常量指针与指针常量的区别

这一题目都是面试中好多公司愿意问的问题,刚好学习到这,就把这块也纳入到本章节中。

指针常量

int *const p;,顾名思义它是一个常量,只不过被指针修饰。

int a = 10, b =20;
int *const p = &a; p = &b; //×
*p = 30; //√

常量指针

const int *p;p是一个常量

int a = 10, b =20;
int *const p = &a; p = &b; //√
*p = 30; //×

2.4 练习题

指向常量的指针常量

int * const p; //指针常量

const int * const p;//指向常量的指针常量

c++和c中const的区别的更多相关文章

  1. C、C++中const的区别

    C语言中: 被const修饰的变量,仍然是变量.虽然不能用C语法给这个变量改变值,但他本质上还是变量. C编译器会给它分配空间. C中,const默认使用的是外部链接. C++中: 被const修饰的 ...

  2. JavaScript中const、var和let区别浅析

    在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...

  3. 实例讲述PHP面向对象的特性;;;php中const与define的使用区别

    php中const与define的使用区别 1.const:类成员变量定义,一旦定义且不能改变其值. define:定义全局常量,在任何地方都可以访问.2.define:不能在类中定义,而const可 ...

  4. C++ 中 const和define的区别

    来源网址:http://wujiangping.blog.163.com/blog/static/195182011201255115125205/ 请区别用#define命令定义的符号常量和用con ...

  5. js中const,var,let区别(转载)

    js中const,var,let区别 来源:https://www.cnblogs.com/zzsdream/p/6372729.html 今天第一次遇到const定义的变量,查阅了相关资料整理了这篇 ...

  6. C#中 const 和 readonly 的区别

    C#中 const 和 readonly 的区别 来源 https://www.cnblogs.com/gsk99/archive/2008/10/10/1308299.html http://dev ...

  7. C++中define与const的区别

    C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下: 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常 ...

  8. php中const与static的区别与使用(转)

    首先关于const 在php的类内部只可以修饰成员属性,不可以修饰方法,如下:   class Test{   const PATH = 'c/';//修饰常量   const function te ...

  9. js中定义变量之②var let const的区别

    var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...

随机推荐

  1. 【linux系统】命令学习(一)ssh

    ssh 1.在终端执行命令  ssh -p22 username@host 2.密码输入是看不到内容的 3.登入成功后默认进入的是home目录,就是根目录下的home目录 4.[root@VM-4-1 ...

  2. 一个简单的golang项目,实验 gitlab-ci-cd Pipelines

    至少两台主机,gitlab + gitlab-runner gitlab + gitlab-runner安装略 项目源码:https://gitee.com/M27149/testgo.git 在自建 ...

  3. Java-ASM框架学习-java概念转字节码概念

    前言 当我们操作字节码的时候,都是和字节码的概念打交道,这让我们很困扰,asm也想到了这点,为了方便,它提供了一个可以把java概念转化为字节码概念的类 import org.objectweb.as ...

  4. 明明pip安装python的模块了,pycharm还是找不到的解决方案

    以前pycharm的安装包和python的环境一直都不能融合在一起,到了今天才知道,原来他们都是有自己的工作环境的 自己的工作环境(虚拟解释器)和安装python的工作环境(基本解释器)不是一个环境, ...

  5. 前台json遍历拼装

    //添加角色. $.ajax({ type: "post", url: "/sysRole/list", data: {page: 1, limit: 1000 ...

  6. c++基础知识-数据类型

    1.每次新建项都可需写内容 #include <iostream> using namespace std; int main() //main函数有且只有一个 { system(&quo ...

  7. Kruskal 重构树小记

    其实也不是多难的知识点吧--学了一个中午+半个下午就把它学会了(做过那道 jxd 作业 CF571D 的应该比较好理解) Kruskal 重构树大概就是在正常 Kruskal 的时候,对于两个需要连边 ...

  8. nmap相关

    nmap -sT IP-sT(全链接扫描),获取目标IP+PORT的状态,其实是发了三个包:SYN,SYN/ACK,ACK,类似于TCP三次握手 状态: open 开放的 closed 关闭的 fil ...

  9. DirectX12 3D 游戏开发与实战第九章内容(下)

    仅供个人学习使用,请勿转载.谢谢! 9.纹理贴图 学习目标 学习如何将局部纹理映射到网格三角形中 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次贴图 ...

  10. pycurl报错: ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend

    报错: ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl ...