环境:VC6
代码1:
int main()
{
const int i=2;
int* p=(int*)(&i);
*p=100;
cout<<"i的值为: "<<i<<endl;
cout<<"指针指向的变量的值: "<<*p<<endl;
cout<<"指针的值: "<<p<<endl;
cout<<"i的地址: "<<&i<<endl;
return 0;
}
结果为:
2
100
0012FF7C
0012FF7C
---------------------------------------------
代码2:
int main()
{
const int& i=2; //加了个引用
int* p=(int*)(&i);
*p=100;
cout<<"i的值为: "<<i<<endl;
cout<<"指针指向的变量的值: "<<*p<<endl;
cout<<"指针的值: "<<p<<endl;
cout<<"i的地址: "<<&i<<endl;
return 0;
}
结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------
代码3:
int main()
{
int a=2; //加了这句
const int i=a; //用a赋值
int* p=(int*)(&i);
*p=100;
cout<<"i的值为: "<<i<<endl;
cout<<"指针指向的变量的值: "<<*p<<endl;
cout<<"指针的值: "<<p<<endl;
cout<<"i的地址: "<<&i<<endl;
return 0;
}
结果为:
100
100
0012FF7C
0012FF7C
---------------------------------------------
疑问:第一段代码指针p的值与i的地址一样,为什么改变不了i的值?
改变不了,但是为什么*p又能输出100?100又存在哪里?
第二段代码加个引用后,为什么就能改i的值了?到底发生了什么?
=================================================================================
常量折叠:
看一个例子:
int main(int argc, char* argv[])
{
const int i=0;
int *j = (int *) &i;
*j=1;
cout < <&i < <endlcout < <j < <endl;
cout < <i < <endl;
cout < <*j < <endl;
return 0;
}
结果是
0012ff7c
0012ff7c
0
1
因为i和j都指向相同的内存地址,所以输出的前两个结果是相同的,但为什么相同的内存里的结果不相同么?--这就是常量折叠.
这个"常量折叠"是 就是在编译器进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表。可以算作一种编译优化。
我只是改了这个地址内容,但是i还是0,
因为编译器在优化的过程中,会把碰见的const全部以内容替换掉(跟宏似的: #define PI 3.1415,用到PI时就用3.1415代替),这个出现在预编译阶段;但是在运行阶段,它的内存里存的东西确实改变了!!!
------------------------------------------------------------------------------------------
第二段从本质上来讲根第三段应该是一样的。
对于第二段,由编译器找了个位置将2存放起来了,相当于匿名变量。
分享到:
相关推荐
轻量级C++插件框架 此框架使用了少部分STL,没有使用MFC、ATL、COM。 通过使用 SWIG,可与 Python、Java 等语言进行集成(当然可以单独使用C++)。 使用此框架可以快速开发出更多的插件和应用软件,此框架已在 ...
Linux下的一个C++编写的轻量级服务器.zipLinux下的一个C++编写的轻量级服务器.zipLinux下的一个C++编写的轻量级服务器.zipLinux下的一个C++编写的轻量级服务器.zipLinux下的一个C++编写的轻量级服务器.zipLinux下的...
mongoose是一个小型、轻量级的Web服务器,它以C语言编写,同时也支持C++。它提供了一个简洁的API,使得开发者能够轻松地将HTTP服务功能集成到自己的应用程序中。mongoose库的主要特点包括: 1. 支持静态文件服务:...
C++使用信号量对共享资源进行互斥访问,多用于进程间的互斥访问。
Linux 下C++共享内存、信号量封装,实现进程同步
但在 C++11中展开参数包稍显麻烦, 而 C++17 的折叠表达式使得展开参数包变得容易, 其基本语法是使用 (…) 的语法形式进行展开。 支持的操作符 C++17中,折叠表达式支持 32 个操作符: +, -, *, /, %, ^, &, |, =,...
Logger是轻量级日志类,提供写日志功能,支持多线程,支持可变形参数操作,支持写日志级别的设置。 博客地址: http://blog.csdn.net/sunflover454/article/details/49758801
C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++C++
职工工作量统计系统设计C++
7. **字面量操作符(Literal Operators)**:C++ 17引入了用户自定义字面量,允许开发者创建自己的语法,如`auto num = 123_kg;`,其中`_kg`是自定义的单位字面量。 8. **新标准库功能**: - `std::optional`:一...
c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏c++小游戏...
// 一个跨平台的轻量级日志类。此类在于展示: // 1. 多线程写日志的思想。(写日志的动作不应对主程序产生较大影响) // 2. 展示了跨平台的线程安全、信号通知等机制 // 3. 展示了一个高效的数据处理器 // 4. 展示...
DevC++是一款轻量级的C++集成开发环境(IDE),尤其适合初学者学习和使用。这个5.11版本的安装包包含了所有必要的组件,让你能够编写、编译和运行C++程序。以下是关于DevC++5.11的一些详细知识点: 1. **DevC++简介...
1. **源代码编辑器**:DEVC++内置了一个功能丰富的源代码编辑器,支持语法高亮、自动完成、代码折叠、括号匹配等功能,帮助程序员提高编写代码的效率。 2. **项目管理**:IDE 提供了项目管理工具,使得组织和管理多...
用VS编写C#时,可以用#region name和#endregion,将代码分段... VS虽然没办法对C/C++语言像C#那样任意分段,任意折叠,但是支持大纲折叠。即支持if语句,循环语句的折叠。虽然不像C#那样方面,但也能将着用了。 具
3. **折叠表达式**:C++17引入了折叠表达式,用于处理模板元编程中的元组和类型列表,使得元编程更加简洁和高效。 4. **字面量操作符重载**:开发者现在可以为自定义类型定义二进制字面量操作符,如`"_"b`或`"_"s`...
引用后可直接调用加密函数的C++代码 自行调整TDES_ENCRYPT_KEY、TDES_ENCRYPT_IV TDES_ENCRYPT_KEY 为Key, TDES_ENCRYPT_IV为偏移量(如不需要则设为空)
Dev C++是一款轻量级的C++集成开发环境(IDE),专为初学者和专业开发者提供简洁、高效的编程环境。这个6.3版本是其历史上的一个重要里程碑,它结合了GCC编译器(GNU Compiler Collection)和一个用户友好的界面,...
《C++编程实例100篇》是一本深入浅出的C++编程教程,它以实践为主导,通过丰富的实例帮助学习者掌握C++语言的基础和核心概念。这本书的每个实例都精心设计,旨在帮助初学者和有经验的开发者巩固和提升C++编程技能。 ...
本文将深入探讨一种实现方法——“边折叠”算法,并以C++语言为例,介绍如何在Visual Studio 2010环境下实现这一过程。 “边折叠”算法是一种常用的网格简化策略,它通过删除或融合选定的边来减少顶点的数量,进而...