c语言和c++语言中const修饰的变量区别浅析

目录
  • c:
    • 修饰全局变量:
    • 修饰局部变量:
  • c++:
    • 修饰全局变量:
    • 修饰局部变量:
  • 总结:
    • 在c语言中:
    • 在c++语言中:
  • 总结

c:

修饰全局变量:

用const修饰的全局变量是没有办法直接修改的,间接的修改也是不成功的(语法可以通过,但是编译运行的时候会报错。)(const只要是修饰全局变量,那么就会储存到常量区中,收到常量区的保护。)

修饰局部变量:

但是如果用const修饰局部变量,同样的也是没有办法直接修改的,但是是可以间接修改的。

int main()
{
    const int b = 10;
    int* p = &b;
    *p = 20;
    pirntf("%d",b);
    return 0;
}

这样就不会报错。(const修饰的局部变量是储存到栈上,相当于分配到内存上,可以修改成功)。

通常叫这种变量为伪常量,不能用这种常量不能构成数组。arr[伪常量]这种写法是错误的。

c++:

修饰全局变量:

const修饰全局变量的效果是和c语言的一样的。无论是直接修改还是间接修改都是报错的。

修饰局部变量:

const修改局部变量,直接修改是不成功的,不会报错,但是输出的结果是修改前的值,相当于没有修改。因为在c++中,const修饰的无论是局部变量还是全局变量都是常量了。数组的初始化可以使用这个const修饰的变量了。

int main
{
    const int a = 100;
    int* p  = (int *)&a;
    *p  = 200;
    cout<<a<<endl;//100
    return 0
}

输出的结果依然是100,注意给p指针赋值的时候需要将&a进行强制类型转换(c++的要求,因为这个时候&a的类型是const int*)

剖析这个代码:

int *p = (int *)&a

实际上是int temp = a 先在栈上创建了一个和a的值一样的变量temp,

当对const修饰的局部变量取地址的时候,编译器会给变量分配临时的内存空间,这个内存空间就是temp的内存空间。而给p赋值的时候就是将这个临时变量的空间的地址赋值给了p。

也就是int*p = &temp然后p指针指向的也就是temp,所以说后来的*p = 200改的就是temp而不是a的值。临时空间没有什么意义。

(const int a =100写出来了以后就一直放在符号表中(键值对一一对应着不会改变。))

总结:

在c++语言中,一个const修饰的变量不是必须创建内存空间的,c语言中,总是需要一块内存空间。

在c语言中:

对于全局变量:

将const修饰的全局变量存储在只读数据段,保存在符号表中,第一次使用的时候再分配内存,程序结束的时候释放。(这个是不能修改的,因为存储在只读数据段中)

对于局部变量:

将const修饰的局部变量存储在栈中,代码块结束的时候释放。(这个是可以修改的,在栈上)

在c++语言中:

对于全局变量:

是否为const变量分配内存空间取决于const变量的用途。如果是作为一个值(用这个值去替换一个函数名),就不分配空间。如果是对这个全局变量取地址,那么会分配内存,存储在只读数据段。两种都是不能进行修改的。

对于局部变量:

如果是const int a = 100;直接放进符号表中,不分配内存。如果对其取地址的话,在栈上分配内存空间temp,修改不成功,因为修改的只是temp的值,对在符号表中的a没有影响。

如果是const int a = b;分配内存。

如果是自定义的类型,比如类对象,分配内存。

总结

到此这篇关于c语言和c++语言中const修饰变量区别的文章就介绍到这了,更多相关c语言和c++中const修饰的变量内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C++中的const关键字及与C语言中const的区别

    const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 0:    当在当前文件之外使用

  • 面试常见问题之C语言与C++的区别问题

    目录 C和C++的区别 关键字static在C和C++区别 1. 定义局部静态变量 2.限定访问区域 答案 结构体在C语言和C++的区别 C中malloc和C++的new区别 C++引用和C的指针有何区别 1.作为函数的参数 2.引用作为函数的返回值 C和C++的区别 C语言是一种结构化语言,其偏重于数据结构和算法,属于过程性语言 C++是面向对象的编程语言,其偏重于构造对象模型,并让这个模型能够契合与之对应的问题.其本质区别是解决问题的思想方法不同 虽然在语法上C++完全兼容C语言,但是两者还

  • C语言和C++的6点区别

    C语言和C++的区别 (1)面向过程语言和面向对象语言 C语言是面向过程语言,即先分析出解决问题的步骤然后再将这些步骤一一实现 C++是面向对象语言,即把问题分成若干个对象,目的是为了描述某个事物在解决整个问题的步骤中的行为 (2)关键字不同 C语言中有32个关键字,而C++有63个关键字.另外在C语言中struct关键字定义的变量不能有函数,而在C++中可以有函数 (3)文件后缀名不同 C语言中源文件的后缀名是.c,C++源文件后缀名是.cpp (4)函数返回值不同 C语言中如果一个函数没有指

  • C语言中const和C++中的const 区别详解

    C语言中const和C++中的const 区别详解 C++的const和C语言的#define都可以用来定义常量,二者是有区别的,const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查. 而C语言中的const与C++也有很大的不同,在C语言中用const修饰的变量仍是一个变量,表示这个变量是只读的,不可显示地更改,而在C++中用const修饰过后,就变成常量了.例如下面的代码: const int n=10; int a[n];

  • C++与C语言的区别你知道吗

    目录 1.结构体区别 1.1.类型上不再需要struct关键字,直接用结构体名即可 1.2.C++结构体中允许函数存在 2.动态内存申请 C语言的动态内存申请 C++的动态申请 3.内存池 4.string类型 总结 1. 结构体区别 1.1. 类型上不再需要struct关键字,直接用结构体名即可 #include <iostream> #include<string> using namespace std; struct MM { char name[20]; int age;

  • C++、C语言和JAVA开发的区别

    1.面向对象没有java彻底. 由于C++要兼容C的内容,而C是面向过程的,所以C++不可避免地出现过程影子,并不算是完全的面向对象的程序设计语言.例如总得要有main或winmain之类的过程吧. 2.C++的移植能力没有java好. 由于C++的事实标准的存在,即各个编译器总存在差异,所以或多或少存 在不兼容.而且各个软件平台的C++启动代码和硬件指令不同,编译后的C++程序一般是不能跨平台的.而java从娘胎里出来就是为了跨平台执行的,不采 用二进制机器码作为最终代码,所以在移植方面较好.

  • 深入浅析C语言与C++的区别与联系

    目录 一.C语言是面向过程语言,而C++是面向对象语言 1.面向过程和面向对象的区别 2.面向过程和面向对象的优缺点 面向过程语言 面向对象语言 二.具体语言上的区别 1.关键字的不同 2.后缀名不同 3.返回值 4.参数列表 5.缺省参数 半缺省参数 全缺省参数 6.函数重载 7.const 总结 8.引用 9.malloc,free && new,delete 10.作用域 C语言虽说经常和C++在一起被大家提起,但可千万不要以为它们是一种编程语言.我们来介绍C语言和C++中的区别和联

  • c语言和c++语言中const修饰的变量区别浅析

    目录 c: 修饰全局变量: 修饰局部变量: c++: 修饰全局变量: 修饰局部变量: 总结: 在c语言中: 在c++语言中: 总结 c: 修饰全局变量: 用const修饰的全局变量是没有办法直接修改的,间接的修改也是不成功的(语法可以通过,但是编译运行的时候会报错.)(const只要是修饰全局变量,那么就会储存到常量区中,收到常量区的保护.) 修饰局部变量: 但是如果用const修饰局部变量,同样的也是没有办法直接修改的,但是是可以间接修改的. int main() { const int b

  • C语言中const和define的区别你了解嘛

    目录 define和const使用 const和define区别 总结 define和const使用 const和define区别 #include <stdio.h> #define A 1 #define B (A+3) // #define C A/B*3 // //const不能重定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义 const double PI=3.14; //const double PI=3.145; #define PI2 3

  • c语言中return与exit的区别浅析

    1. exit 用于在程序运行的过程中随时结束程序,exit 的参数是返回给OS的.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流.关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件.exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数. 2. return是语言级别的,它表示了调用堆栈的返回:而exit

  • C语言中的const如何保证变量不被修改

    这小段文章要理清楚的是,在C语言中,const是如何保证变量不被修改的? 我们可以想到两种方式: 第一种,由编译器来阻止修改const变量的语句,让这种程序不能通过编译: 第二种,由操作系统来阻止,即把const 的内存地址访问权限标记为"只读",一旦运行中的程序试图修改它,就会产生异常,终止进程. 上面想到的这两种方式,都能达到让某一变量的值不被修改的目的,那么究竟是哪一种呢?我们写两个例子来看一看. 先来看一个简单的例子,源文件const.c: #include <stdio

  • C语言中const和指针的秘密你知道吗

    目录 指针的赋值 问题 ANSI C 有关简单赋值的标准 问题解决 char* 和 const char* char** 和 const char** const修饰 const修饰变量 const修饰指针 const int* p int* const p const int* const p 总结 指针的赋值 问题 将一个类型为 char** 的值赋值给一个 const char** 类型的对象是否合法呢? 先说结果,在vs的环境下,编译器不会报错也不会有任何警告. 但在linux环境下用g

  • C语言入门篇--四大常量(字面,const修饰,宏,枚举)及标识符

    目录 1.字面常量 2.const修饰的常变量 3.#define定义的标识符常量 3.1标识符 3.2宏常量 4.枚举常量 1.字面常量 (1)字面意思是啥就是啥,看其表示就可以知道其值和类型. (2)有值无名,一用来初始化变量,与一种字符相关联. #include <stdio.h> int main() { 10;//int型数字10 'c';//char型字符c "Hello world!";//字符串常量(!C语言无字符串类型) int sum=10+20;//1

  • C++ const修饰变量和修饰函数介绍

    const修饰变量 关于const最常见的一个面试题是这样的:char *const和const char*有什么区别,大家都知道const修饰符代表的是常量,即const修饰的变量一旦被初始化是不能被更改的,这两个类型一个代表的是指针不可变,一个代表指针指向内容不可变,但具体哪个对应哪个,很多人一直搞不清楚. 有这样一个规律,const修饰的是它前面所有的数据类型,如果const在最前面,那么把它和它后面第一个数据类行交换.比如上面的const char*交换之后就是char const *,

  • C语言中const与指针使用方法总结

    C语言中const与指针使用方法总结 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有互补,只有分享,才能使彼此更加成长. 总结: * const 值不能改变,指向可改变 const * 值能改变,指向不可改变 const * const 都不能改变 实例代码: #include <stdio.h> int main(int argc, const char * argv[]) { // 1 可改

随机推荐