(常指针、指针常量)和(常目标指针、常量指针)的区分

一、(常指针、指针常量)和(常目标指针、常量指针)的区分

1、常指针、指针常量:

这两个是同一个意思,都是在修饰指针,主语为指针,说指针是一个常量(*const p),指针的指向不能改变。

例子:数组名为指针常量,数组名代表数组首地址,指针指向不能改变。

2、常目标指针、常量指针:(经常用来保护数据,我们应该经常使用这个)

都是在修饰常量,主语是目标,说目标是常量(const *p),*p的内容不能被修改。

例子:存储在只读存储区的字符串,该字符串是一个常量,内容不能被修改。

3.附加题:

定义一个指向常量的指针常量:

分析:1)这是一个指针,指针要是一个常量--->*const p

2)整体又是一个常量,所以 const *const p

3)答案:int const *const p 或者 const int *const p;

4.记忆方法:

1)常指针,说的就是指针是一个常量,指针就是p 所以直接 * const p;

2)指针常量,这里都说了指针是常量,那指针就是一个常量,指针就是p 所以直接 * const p;

3)常目标指针:常目标的意思就是目标是常量,目标就是*p,所以直接const * p;

4)常量指针:常量是指针?这个说法就有问题,常量就是常量,内容不可以修改*p,所以直接const * p;

5)指针是常量。所以地址不能修改(指向不能修改);目标是常量,所以内容不能修改

<think>嗯,我现在得仔细想想怎么区分常量指针指针常量。这两个术语听起来很像,容易搞混。首先,我得回忆一下C或C++里的指针概念。指针本身是一个变量,存储的是另一个变量的内存地址。而这里的常量可能涉及到指针本身的不可变或者指向的内容的不可变。 我记得常量指针指针常量的关键在于const关键字的位置。比如,如果const在*前面,那可能是指针指向的内容不能变,而指针本身可以改变指向的地址。反之,如果const在*后面,那可能指针本身不能改变指向,但指向的内容可以修改。或者是不是反过来呢?有时候容易记混。 比如,常量指针应该是“指向常量指针”,也就是说,指针可以指向不同的地址,但通过这个指针不能修改所指向的内容。这种情况下,const应该在类型前面。例如:const int *p; 这里p是一个指向const int的指针,所以*p不能被修改,但p可以指向其他int变量。 而指针常量则是“指针本身是常量”,也就是说,指针一旦初始化后,不能再指向其他地址,但指向的内容可以修改。这时候,const应该出现在*后面。例如:int *const p = &a; 这里p一旦指向a后,就不能再指向b,但*p可以修改a的值。 是不是这样?可能还要再找例子验证一下。比如,假设有一个int变量ab,常量指针的话,p可以指向a,然后p = &b是可以的,但*p = 5会报错。而指针常量的话,p在初始化时指向a,之后p = &b会报错,但*p = 5是允许的。 另外,还有一种情况是两者都是常量,即指向常量指针常量,比如const int *const p = &a; 这时候p不能改变指向,也不能通过p修改a的值。 总结一下,常量指针(pointer to constant)的const在类型前,指针可以变,内容不可变;指针常量(constant pointer)的const在指针变量名前,指针不可变,内容可以变。而区分两者的关键可能在于const的位置相对于*的位置:当const在左边,修饰的是数据类型,即指向的内容为常量;当const在右边,修饰的是指针变量本身,指针的指向不可变。 有时候可能会有写法上的混淆,比如int const *pconst int *p是否一样?是的,它们都是指向const int的指针,即常量指针。而int *const p则是指针常量。所以要看const是在*左边还是右边。如果const在*左边,不管是在类型前还是类型后,都是修饰数据;如果const在*右边,则是修饰指针本身。 可能还可以用英文术语帮助记忆:pointer to const(常量指针const pointer(指针常量)。这样的话,前者重点在指向的是常量,后者指针本身是常量。 另外,中文里可能“常量指针指针常量”这两个词组的中心词不同。比如,“常量指针”中心是“指针”,即这个指针是一个指向常量指针;而“指针常量”中心是“常量”,即这个指针本身是个常量。所以,可以通过调整语序来理解,前者是“指向常量指针”,后者是“指针类型的常量”。 所以总结的话: - 常量指针:const int *p 或 int const *p。指向的内容不可变,指针可以改变指向。 - 指针常量:int *const p。指针的指向不可变,内容可以改变。 - 两者都不可变:const int *const p。</think>在C/C++中,区分**常量指针****指针常量**的关键在于`const`的位置及其作用对象: --- ### 1. **常量指针(Pointer to Constant)** - **定义**:指针指向的内容不可修改,但指针本身可以指向其他地址。 - **语法**:`const 类型 *指针名` 或 `类型 const *指针名`。 - **特点**: - `const`修饰的是指针指向的数据类型(如`const int`)。 - 指针可以重新指向其他地址,但无法通过指针修改指向的内容。 - **示例**: ```cpp const int *p; // 或 int const *p; int a = 10, b = 20; p = &a; // 合法 // *p = 30; // 非法!不能修改指向的内容 p = &b; // 合法,指针可以指向其他地址 ``` --- ### 2. **指针常量(Constant Pointer)** - **定义**:指针本身是常量(指向的地址不可变),但可以通过指针修改指向的内容。 - **语法**:`类型 *const 指针名`。 - **特点**: - `const`修饰的是指针变量本身。 - 指针初始化后不能指向其他地址,但可以修改指向的内容。 - **示例**: ```cpp int a = 10, b = 20; int *const p = &a; // 初始化时必须赋值 // p = &b; // 非法!指针不能重新指向 *p = 30; // 合法,可以修改指向的内容 ``` --- ### 3. **双重常量(Constant Pointer to Constant)** - **定义**:指针本身指向的内容均不可修改。 - **语法**:`const 类型 *const 指针名`。 - **示例**: ```cpp const int *const p = &a; // p = &b; // 非法! // *p = 30; // 非法! ``` --- ### 记忆技巧 - **看`const``*`的相对位置**: - `const`在`*`**左边**(如`const int *p`):指向的内容不可变(常量指针)。 - `const`在`*`**右边**(如`int *const p`):指针本身不可变(指针常量)。 - **中文语义**: - “常量指针” → 指向常量指针(内容不可变)。 - “指针常量” → 指针常量(指向不可变)。 --- ### 总结 | 类型 | 语法示例 | 指针指向可变? | 指向内容可变? | |---------------------|----------------|----------------|----------------| | 常量指针 | `const int *p` | 是 | 否 | | 指针常量 | `int *const p` | 否 | 是 | | 双重常量 | `const int *const p` | 否 | 否 | 理解这一点有助于避免因`const`位置错误导致的编译问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值