美文网首页
【记2】const小记

【记2】const小记

作者: CozyMoonquake | 来源:发表于2018-05-27 16:56 被阅读0次

一、首先介绍C语言中的const功能。

const int a;
int const b;
//以上两种定义方式相同,a、b都是一个常整型数

const int *c;  
//c是一个指向常整型数的指针(所指向的内存数据不能被修改,但指针本身可修改)

int * const d;
//d是常指针(指针变量不能被修改,但d所指向的内存空间可被修改)

const int * const e;
//e是一个指向常整型的常指针(指针和其所指向的内存空间,均不能被修改)

二、开始比较C语言与C++中的const区别。
在C语言中,若采用以下代码,输出结果都为50。

#include<stdio.h>
int main(void)
{
    const int a = 10;
    int *p = &a;
    *p = 50;

    printf("a=%d\n",a);
    printf("*p=%d\n", *p);
    return 0;
}

而在C++中,采用以下代码,输出结果a为10,*p为50。

#include<iostream>
using namespace std;
int main(void)
{
    const int a = 10;
    int *p = (int*)(&a);
    *p = 50;

    cout << a << endl;
    cout << *p << endl;
    return 0;
}

以上结果说明,其实C语言中定义的是“假”常整型变量,C++中定义的才是“真”的常整型变量。在执行const int a = 10时,编译器会创建一个符号表,其中的a并没有所谓的空间和地址,符号表给a一个值为10,一旦使用到a,就赋为10。其功能与define类似,但define是在预处理阶段执行,而const是在编译阶段执行。
此时,有个问题,a是个常量10,常量是没有地址的,*p对其取地址又是什么意思呢?其实在C++中,如果对一个常量取地址,编译器会临时开辟一个空间temp,让这个指针p存放这个临时空间的地址。在上面的代码中,即会定义一个int temp,让p来指向这个temp,所以在执行 *p=50的时候不会出错,其改变的是临时开辟的temp变量而不是a。

相关文章

  • 【记2】const小记

    一、首先介绍C语言中的const功能。 二、开始比较C语言与C++中的const区别。在C语言中,若采用以下代码,...

  • 如何理解js中的深拷贝和浅拷贝

    小记~ 一、什么是深拷贝、浅拷贝? const A = [1,2,3,4,[5,6]]浅拷贝:也就是拷贝A对象里面...

  • C语言的灵魂-指针

    const指针: int const *p1;int *const p2 ;const int * const ;...

  • 浅谈const修饰

    (1)const int a; (2)int const a; (3)const int *a; (4)int *...

  • 给变量赋值

    常规赋值const a = 1;const b = 2;const url = b > a ? 100 : 0如果...

  • const,static,extern小记

    一、const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们...

  • fetch实现ajax

    ajax: {obj2String (opts) {const arr = [];for (const attr ...

  • iOS -> 正确使用static、extern、cons

    1、const与宏 #define 的区别: 2、static与const结合使用 3、extern与const ...

  • es6小记

    title: es6小记 变量与常量 let 定义变量, const 定义常量,常量定义一次后,不可更改 不可重复...

  • 密码强度正则实例

    1、验证规则 2、正则 const reg1 = /[A-Z]{1}/; const reg2 = /(?=....

网友评论

      本文标题:【记2】const小记

      本文链接:https://www.haomeiwen.com/subject/kuwbjftx.html