const int a = 10; int *p = (int *)&a; *p = 100; a的值到底有没有改变

本文通过实验探讨了C++中const修饰的局部与全局变量通过指针修改的可行性,揭示了不同编译器(gcc与g++)在处理同一代码时的不同表现及其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[cpp]  view plain copy
  1. const int a = 10;  
  2. int *p = (int *)&a;  
  3. *p = 100;  
很多人面试的时候都会被问这段代码最后a和*p分别是多少。答案不过三种:要么程序报错,要么a=10,*p=100,要么a=100,*p=100;
其实这个地方是分const变量是全局还是局部的情况,先看局部情况:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.         const int a = 10;  
  5.         int *p = (int *)&a;  
  6.         *p = 100;  
  7.         printf("%d\t%d\n", a, *p);  
  8.         return 0;  
  9. }  
这份代码保存为main.c,先用gcc编译,结果如下:


注意结果,a和*p都是100,说明a的值是可以被修改的。但是先不要着急,再看看g++的结果。


结果让人大吃一惊,居然和gcc输出不一样,为什么呢?我只能说和编译器有关,仅此而已,那么有没有在g++下出现两个100呢,答案是在const前加上volatile

好,const是局部变量就讨论到这儿,再看看const是全局变量的情况:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. const int a = 10;  
  3. int main()  
  4. {  
  5.         int *p = (int *)&a;  
  6.         *p = 100;  
  7.         printf("%d\t%d\n", a, *p);  
  8.         return 0;  
  9. }  

可以 看到程序崩溃了,那么g++呢?


同样程序崩溃!

我们暂且把局部变量时gcc和g++的输出不同归结为编译器的原因,那么为什么全局变量会引起程序崩溃?

大神的解答是这样的:那是因为常量在的那个内存页设了只读属性,要是你用函数把那页改成可写的就不会死了。全局const是放到了只读的text段。全局静态存储区 页面属性只读”

好了,就到这儿吧,但愿面试官这道这些,不然只要我们回答的和他的不相符,他就认为我们是错误的。

<think>好的,我现在要解决用户的问题,关于C++中常量指针的示例代码解析。用户提供的代码是: #include iostream const int a 10 int *p &amp;a cout << *p 首先,我需要仔细分析这段代码可能存在的问题,并解释运行结果。用户提到想了解常量指针的相关问题,所以我需要结合常量指针的概念来解析。 首先,检查代码语法。用户提供的代码没有使用正确的C++语法,可能缺少分号、using namespace std,以及main函数结构。正确的代码应该像: #include <iostream> using namespace std; int main() { const int a = 10; int *p = &amp;a; cout << *p; return 0; } 但即使修正了语法,这段代码仍然有问题。因为a是const int,而p被声明为指向int的指针,这里试图将const int的地址赋给非const指针,这在C++中是未定义行为,会导致编译错误。正确的做法应该是使用const int* 或者int const* 来声明指针,以保持类型一致。 接下来,我需要解释为什么这样的赋是错误的。根据C++的类型安全规则,不能将const变量的地址赋给非const指针,因为这可能允许通过指针修改常量,违反了const的语义。编译器通常会报错,比如“invalid conversion from ‘const int*’ to ‘int*’”。 然后,关于运行结果,如果用户强制进行类型转换(如int *p = const_cast<int*>(&amp;a);),虽然编译通过,但修改*p的会导致未定义行为,因为a本身是常量。此时输出*p可能显示10,但试图修改*p的会导致问题。 此外,用户提供的引用资料中,引用[3]和[4]提到了常量指针和指针常量的区别。这里的问题涉及到常量指针的正确使用,即指向常量的指针应该声明为const int*,而不是int*。需要指出用户代码中的错误类型声明,并给出修正后的示例。 最后,生成相关问题,帮助用户进一步理解常量指针、指针常量以及const在不同位置的含义。</think>以下是对C++常量指针示例代码的解析及运行结果说明: --- ### 代码问题分析 原始代码存在语法错误和类型安全问题: ```cpp #include <iostream> using namespace std; int main() { const int a = 10; // 定义常量整型变量 int *p = &amp;a; // 错误:将const int*int* cout << *p; // 尝试输出 return 0; } ``` #### 关键问题说明 1. **类型不匹配错误** 将`const int a`的地址`&amp;a`(类型为`const int*`)赋给`int*`类型指针`p`,违反了C++的`const`正确性规则[^3]。编译器会报错:`invalid conversion from 'const int*' to 'int*'`。 2. **常量性破坏风险** 若强制通过`int*`指针修改`a`的(如`*p = 20;`),会导致未定义行为,因为`a`是常量[^5]。 --- ### 修正后的代码 ```cpp #include <iostream> using namespace std; int main() { const int a = 10; const int *p = &amp;a; // 正确:声明为指向常量的指针 cout << *p; // 输出10 return 0; } ``` #### 运行结果 ``` 10 ``` --- ### 核心概念解析 1. **指向常量的指针 (`const int*` 或 `int const*`)** - 指针指向的不可修改,但指针本身可以指向其他地址[^3]。 - 示例:`const int *p = &amp;a;`(`a`是常量或非常量均可) 2. **指针常量 (`int* const`)** - 指针的地址不可修改,但可通过指针修改指向的[^4]。 - 示例:`int* const p = &amp;b;`(`b`必须是非常量) 3. **指向常量的指针常量 (`const int* const`)** - 指针地址和指向的均不可修改。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值