const关键字定义指针

------------------------------------------
1、 const int numm = 500;
1.1、int num = 1000;
2、 const int* a = &numm;
3、 int const *a = &numm;
4、 int * const a = #
5、 const int* const a = &numm;
------------------------------------------
如果const位于*左侧,则const修饰真正所指向的变量,即指针所指向的是一个常量;
反之,如果const位于*的右侧,那么const就是修饰指针本身,即指针本身是常量;


所以第2行和第3行表示指针所指向的内容是常量,所以不能*a = 99,即不能通过它对所指对象赋值
第4行表示这个指针本身是常量,所以不能a++,即不能再让它指向其他地方了
第5行则是完全限制a所指对象不能变,且不能再指向其它对象


上述是使用const修饰变量的
但是事实上在函数声明中使用const往往更加重要,
通常在函数声明中const可以用来修饰函数的返回值,或某个参数。


使用const关键字来修饰的函数参数的一般形式如下:


类型名 function(const Type* parameter); //const修饰函数引用参数
或者
类型名 function(const Type& parameter); //const修饰函数指针参数


如果形参为const Type* parameter,则不能对传递进来的指针所指向的内容进行修改
如果形参为const Type& parameter,则不能对传递进来的引用对象进行改变,即该方式保护了原对象本身


使用const修饰函数返回值的形式如下:


const Type function (参数表);
如果返回的是内部类型有无const都无所谓
但是对于非内部类型就不同了
一般在类成员函数的声明中可以使用const,且一般将其放在函数体后形式如下:


void function() const;

这种方式表示被修饰的成员函数将无法对成员变量进行修改


另外对于引用(&),上述规则同样适用

<think>我们正在讨论如何修改被const关键字定义的普通变量。根据C/C++语言规范,const定义的变量是常量,不应该被修改。但根据引用[5]中的示例,似乎可以通过指针来绕过const限制进行修改。下面我将结合引用内容逐步分析: 引用[1]和[2]明确指出:const修饰的普通变量是不可变的,相当于常量。例如: ```c const int MAX_VALUE = 100; ``` 引用[5]则提供了具体的代码示例,展示如何通过指针修改const普通变量: ```c // 定义了一个常量a const int a = 10; // 通过指针修改常量a int *p = (int*)&a; // 需要强制类型转换去除const属性 *p = 13; printf("%d\n", a); // 输出可能是10也可能是13,取决于编译器优化 printf("%d\n", *p); // 输出13 ``` 注意:这种行为是未定义行为(Undefined Behavior)。因为C/C++标准规定,尝试修改const对象会导致未定义行为。实际结果取决于编译器和运行环境: 1. 某些编译器(如gcc)会将const变量放入只读数据段,尝试修改会导致段错误。 2. 在栈上分配的const变量可能被修改,但可能因为编译器优化而出现不一致(如上述代码中printf("%d\n", a)可能仍输出10,因为编译器已将a替换为常量10)。 3. 使用强制类型转换去除const属性是危险的。 因此,虽然技术上可以通过指针强制修改,但这违背了const的语义,不推荐使用。若需修改,应重新设计程序,避免使用const或使用可变的替代方案。 总结步骤(不推荐,仅用于理解): 1. 获取const变量的地址。 2. 使用强制类型转换将`const T*`转换为`T*`。 3. 通过转换后的指针修改值。 但请注意:这是不安全且不可移植的。 §§相关问题§§ 1. 为什么通过指针修改const变量会导致未定义行为? 2. 在C++中,如何正确设计程序以避免修改const变量? 3. const变量的存储位置有哪些?哪些情况下尝试修改会导致程序崩溃? </think>### 修改const关键字定义的普通变量方法 在C/C++中,**const修饰的普通变量本质上是只读常量**,直接修改会引发编译错误。但通过指针强制类型转换可间接修改(需注意这是未定义行为): ```c const int a = 10; // const常量 printf("原始值: %d\n", a); // 输出: 10 // 通过指针强制修改 int *p = (int*)&a; // 强制类型转换去除const *p = 20; // 修改内存值 printf("修改后: %d\n", a); // 可能输出10(编译器优化) printf("指针值: %d\n", *p); // 输出: 20 ``` #### 关键说明: 1. **语法原理** - `const int a` 将变量放入只读内存区 - 强制类型转换 `(int*)&a` 欺骗编译器获取写权限 - 实际修改的是内存数据(非符号表常量) 2. **未定义行为警告** - 若常量被编译器优化为字面量(如 `printf("%d", a)` 被替换为 `printf("%d", 10)`),显示值不会改变 - 在只读内存段(如全局const)修改会导致段错误崩溃 - 违反语言规范,实际开发中应绝对避免 3. **正确做法** ```c // 需要"常量"时使用宏定义 #define MAX_VALUE 100 // 需要运行时保护时使用getter封装 private: int value; public: int getValue() const { return value; } ``` > 此操作仅用于理解底层机制,实际开发必须遵守`const`的不可变性约定[^1][^5]。编译器可能通过常量传播优化代码,使修改看似无效[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值