const关键字修饰变量

char * const cp     : 定义一个指向字符的指针常数,即const指针

const char* p       : 定义一个指向字符常数的指针

char const* p       : 等同于const char* p

 

const   char   **是一个指向指针的指针,那个指针又指向一个字符串常量。  



const char*指向的内存空间真的不能修改吗?
我的理解是:
用const char *p 指向得一块空间,不能通过p指针对内存空间进行写入。
同样一块空间,用char *q去指向它,就可以借助char *q修改其中的内容。



<think>好的,用户的问题是“为什么使用const关键字修饰变量,依然能够更改它的值?”,我需要解释const的行为。首先,我应该回忆一下JavaScript中const的基本规则。const声明的变量是不可重新赋值的,但这并不意味着变量指向的值不可变,而是变量的绑定(即变量名到内存地址的映射)不可变。 接下来,需要区分基本类型和引用类型。对于基本类型(如number、string、boolean),变量存储的是实际值,所以用const声明后,值不能改变,否则会报错。但对于引用类型(如对象、数组、函数),变量存储的是指向内存中对象的引用(地址),const只是保证这个引用地址不变,但对象本身的内容(属性、元素)是可以修改的。 然后,需要举例子说明。比如,用const声明一个对象,然后修改其属性,这是允许的,因为引用地址没有变。但如果尝试将变量重新赋值为另一个对象,就会报错,因为改变了绑定。 还要注意用户可能的误区,认为const声明的变量完全不可变,需要明确说明不可变的是绑定,而不是值本身。可能需要对比let和var,强调const的不可重新赋值特性。 最后,总结关键点:const限制的是变量绑定的重新赋值,而不是变量指向的值的修改。对于引用类型,修改其内容不会改变绑定,因此是允许的。 现在需要检查是否有遗漏,比如是否提到了基本类型和引用类型的区别,是否用例子说明,是否解释了绑定的概念。确保回答清晰,覆盖用户的疑问点。 </think>在JavaScript中,使用`const`关键字声明的变量“可以更改值”的现象,本质是对`const`语义的理解误区。`const`的核心限制是**禁止变量绑定的重新赋值**(即变量名到内存地址的映射不可变),但**不限制变量指向的值的内部修改**。具体原因需结合数据类型的存储方式分析: --- ### 1. `const`的核心规则:绑定不可变 `const`声明的变量,其“绑定”(即变量名与内存地址的关联)是固定的,**不允许通过赋值操作改变这个绑定**。例如: ```javascript const a = 10; a = 20; // 报错:Assignment to constant variable(不能重新赋值) ``` --- ### 2. 基本类型(值类型):修改值等价于重新绑定 基本类型(如`number`、`string`、`boolean`等)的变量直接存储**值本身**,因此修改值的操作会隐式触发“重新绑定”。例如: ```javascript const b = { x: 1 }; // 错误示例(假设b是基本类型) // 实际场景中,基本类型无法通过修改值来保持绑定,因此const声明的基本类型变量值不可变 ``` 若`const`声明的是基本类型变量(如`const c = 5`),尝试修改其值(如`c = 6`)会直接违反“绑定不可变”规则,因此会报错。 --- ### 3. 引用类型(对象/数组等):修改内容不影响绑定 引用类型(如对象、数组、函数)的变量存储的是**指向内存中对象的引用地址**,而不是对象本身。`const`仅限制变量的引用地址不可变,但允许通过该地址修改对象的内部属性或元素。例如: ```javascript const obj = { name: '张三' }; obj.name = '李四'; // 允许:修改对象内部属性(引用地址未变) obj = { name: '王五' }; // 报错:尝试重新绑定变量(引用地址改变) const arr = [1, 2, 3]; arr.push(4); // 允许:修改数组内容(引用地址未变) arr = [5, 6, 7]; // 报错:重新绑定变量(引用地址改变) ``` --- ### 关键总结 | 变量类型 | `const`的限制 | 是否可修改值? | 示例 | |----------------|-------------------------------|----------------------------------|---------------------------------------| | 基本类型(值类型) | 绑定不可变(变量指向的值不可变) | 不可修改(修改即重新绑定) | `const a = 10; a = 20;`(报错) | | 引用类型(对象/数组) | 绑定不可变(变量指向的地址不可变) | 可修改内部属性/元素(地址未变) | `const obj = {x:1}; obj.x=2;`(允许) | --- ### 补充说明 - **不可变数据**:若需彻底禁止对象内容被修改,需使用`Object.freeze()`(浅冻结)或深冻结方法,但这与`const`无关。例如: ```javascript const frozenObj = Object.freeze({ name: '张三' }); frozenObj.name = '李四'; // 静默失败(严格模式下报错) ``` - **ES6之前的对比**:ES6前无`const`,`var`/`let`声明的变量可自由重新赋值;`const`的引入是为了明确“变量绑定不可变”的语义,避免意外的重新赋值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值