指针常量和常量指针的区别

指针常量是指定义的指针只能在定义的时候初始化,之后不能改变其值,格式如下:

数据类型 * const 指针常量名称

比如 : char * const p1 ;  int * const p2;

常量指针的值不能改变,但是其指向的内容却可以改变。

char a[5]="abcd";
char *const b =a;

b[0] = 'c';

这样子 字符串a就变成了“cbcd”

 

常量指针是指向常量的指针,因为常量指针指向的对象是常量,因此这个对象的值是不能够改变的。

定义格式如下:

数据类型 const * 常量指针名称

或者

const 数据类型 * 常量指针名称

如: int const *p; const int *p;

char a[5]="ba";
char b[5]="ab";
const char *c = a;
const char *d = b;


a[0] = '7';
b[0] = '8';


c = b;
d = a;//这能编译通过

//
c[0] = '6'//编译通不过,因为c是常量指针,指向的对象是常量,不能改变

 

指针常量是强调指针的不可改变性,而常量指针强调的是指针对其所指对象的不可变性。无论是指针常量还是常量指针,其最大的用途就是作为函数的形式参数,保证实参在被调用的时候不可更改。

 

两者的结合写法:

const char *const c 这种表示 c不能更改,c指向的内容也不能通过c进行更改

 

char str1[] = "abc";
char str2[] = "abc";

const char str3[] = "abc";
const char str4[] = "abc";

const char* str5 = "abc";
const char* str6 = "abc";

char* str7 = "abc";
char* str8 = "abc";


cout<<(str1==str2)<<endl;
cout<<(str3==str4)<<endl;
cout<<(str5==str6)<<endl;
cout<<(str7==str8)<<endl;

 

答案是  0011

原因是 str1 str2 str3 str4 是数组变量,它们有各自的内存空间,而数组名就是数组的首地址。由于四个数组分别定义了不同的内存空间,所以这四个数组变量地址各不相同。。。。

str5 str6 str7 str8是指针,它们指向相同的常量区域。

 

转载于:https://www.cnblogs.com/ShalenChe/p/5470966.html

<think>好的,我现在需要帮用户理解指针常量常量指针区别。首先,用户提供的四个引用都详细讨论了这两个概念,所以我应该仔细参考这些资料来确保回答的准确性。 首先,我要明确两者的定义。根据引用3,指针常量指针的指向不可变,但内容可以变。而常量指针则是指针指向的内容不可变,但指向可以改变。这一点是关键,用户可能容易混淆两者的名称实际含义。 接下来,我需要对比它们的语法结构。引用2提到指针常量的写法是int *const p,而常量指针是const int *p或int const *p。这里的const位置不同,决定了修饰的是指针本身还是指针指向的内容。用户可能对语法细节不太清楚,所以需要明确说明。 然后,应用场景用法也很重要。比如指针常量常用于需要固定指针地址的情况,比如硬件寄存器操作,而常量指针用于保护数据不被修改,比如函数参数传递。引用4中的例子显示,如果尝试修改指针常量的指向会导致错误,这可以用来举例说明。 另外,用户可能会混淆两者的名称,因为“指针常量”听起来像是“指针常量”,而“常量指针”听起来像是“指向常量指针”,但实际上名称实际作用是相反的。需要强调这一点,帮助用户记忆。 还需要考虑用户可能的疑问,比如如何区分两者的写法。引用2提到可以通过口诀“const在*前是常量指针,const在*后是指针常量”,这样的记忆方法对用户可能有帮助。 最后,确保回答结构清晰,分点对比,并给出示例代码,帮助用户理解。同时生成相关问题,引导用户深入学习,比如应用场景、常见错误等。</think>### 指针常量常量指针区别及用法(C语言) #### 一、核心区别总结 | **特性** | **指针常量** | **常量指针** | |----------------|---------------------------|---------------------------| | **定义核心** | 指针的地址不可变 | 指向的数据不可变 | | **语法格式** | `int *const p = &a;` | `const int *p = &a;` | | **可修改性** | 地址固定,内容可变 | 地址可变,内容不可变 | | **错误示例** | `p = &b;`(地址不可改) | `*p = 20;`(内容不可改) | #### 二、详细对比分析 1. **指针常量(Pointer Constant)** - **定义**:指针本身是常量,即指针存储的地址不可修改,但可以通过指针修改指向的内容。 - **语法**:`type *const 指针名` ```c int a = 10, b = 20; int *const p = &a; // p的地址固定为&a *p = 15; // 正确:修改a的值为15 p = &b; // 错误:无法修改指针地址 [^4] ``` - **用途**:硬件寄存器映射、固定地址操作场景。 2. **常量指针(Constant Pointer)** - **定义**:指针指向的数据是常量,不能通过该指针修改数据,但可以修改指针指向的地址。 - **语法**:`const type *指针名` 或 `type const *指针名` ```c int x = 5, y = 6; const int *p = &x; // p指向x,但*x不可通过p修改 p = &y; // 正确:修改指针指向y *p = 8; // 错误:无法修改y的值 [^3] ``` - **用途**:函数参数传递(保护原始数据),如`void print(const char *str)`。 #### 三、记忆技巧 - **口诀**:**const在*前是常量指针,const在*后是指针常量** [^2] - **类比**: - 指针常量:家门锁死(地址固定),但屋内物品可换(内容可变)。 - 常量指针:屋内物品锁死(内容固定),但可搬去其他房子(地址可变)。 #### 四、综合示例代码 ```c #include <stdio.h> int main() { int num1 = 10, num2 = 20; // 常量指针:指向的数据不可变 const int *ptr1 = &num1; ptr1 = &num2; // 正确:改变指向 // *ptr1 = 30; // 错误:无法修改数据 // 指针常量指针地址不可变 int *const ptr2 = &num1; *ptr2 = 30; // 正确:修改num1的值 // ptr2 = &num2; // 错误:无法改变地址 // 指向常量指针常量(双const) const int *const ptr3 = &num1; // ptr3 = &num2; // 错误:地址不可改 // *ptr3 = 40; // 错误:数据不可改 return 0; } ``` #### 五、常见问题 1. **为什么字符串赋值可能引发错误?** - 若声明为`char *const str = "apple";`,尝试`str = "orange";`会触发错误,因为指针地址不可变[^4]。 2. **如何选择使用哪种指针?** - 需要保护数据时用常量指针(如函数参数)。 - 需要固定地址时用指针常量(如硬件操作)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值