文章目录
常量指针、指针常量和指向常量的常指针的区别
1. 指针的基本概念
指针是一个变量,用于存储另一个变量在内存中的地址。通过指针,可以直接访问或修改该内存地址上的数据。
int a = 10;
int *p;
p = &a; // 将变量 a 的地址赋值给指针 p
- 内存地址:内存被视为一个线性的字节数组,每个字节都有唯一的地址,称为内存地址。
- 指针大小:
- 32 位系统:在32位系统中,处理器一次能处理的最大位数是2的32次方 ,也就是一次处理4个字节的内存数据,那么指针的长度也就是4个字节
- 64 位系统:处理器一次能处理的最大位数是2的64次方 ,也就是一次处理8个字节的内存数据,那么指针的长度也就是8个字节。
2. const
关键字
- 定义:
const
是用于限定变量不可修改的关键字。 - 作用:被
const
修饰的变量,其值在初始化后不能被改变。
const int a = 7;
// a = 8; // 错误,不能修改 const 变量的值
3. 指针常量、常量指针和指向常量的常指针
3.1 指针常量(Pointer Constant)
-
特点:
- 指针的指向 不可变。
- 可以修改指针所指向的值。
-
声明方式:
int *const p = &a;
-
示例:
int a = 10; int *const p = &a; *p = 20; // 合法,修改指针指向的值 // p = &b; // 非法,不能改变指针的指向
3.2 常量指针(Pointer to Constant)
-
特点:
- 指针的指向 可变。
- 不能修改指针所指向的值。
-
声明方式:
const int *p = &a; // 或 int const *p = &a;
-
示例:
int a = 10; int b = 20; const int *p = &a; // *p = 30; // 非法,不能修改指针所指向的值 p = &b; // 合法,可以改变指针的指向
3.3 指向常量的常指针(Constant Pointer to Constant)
-
特点:
- 指针的指向 不可变。
- 不能修改指针所指向的值。
-
声明方式:
const int *const p = &a;
-
示例:
int a = 10; const int *const p = &a; // *p = 20; // 非法,不能修改指针所指向的值 // p = &b; // 非法,不能改变指针的指向
4. 区分方法
4.1 按照命名顺序
- 指针常量:
int *const p
,先有指针int *
,后有const
修饰指针p
,表示指针是常量。 - 常量指针:
const int *p
或int const *p
,const
修饰指向的数据,表示数据是常量。
4.2 根据 const
位置
const
紧挨着类型名(在*
左侧):常量指针,不能修改所指向的数据。const
紧挨着指针名(在*
右侧):指针常量,不能修改指针的指向。- 两侧都有
const
:指向常量的常指针,指针和指向的数据都不可修改。
4.3 从右向左阅读
int const *p
:*p
是const int
,不能修改指向的数据,指针p
可变。int *const p
:p
是const
,指针不可变,但可以修改指向的数据*p
。
5. 实际应用
-
常量指针用于函数参数:防止函数内部修改传入的数据。
size_t strlen(const char *str); // 常量指针,保证函数内部不修改 str 的内容
-
示例:
char str[] = "hello"; size_t len = strlen(str); // strlen 函数内部不能修改 str 的内容
6. 注意事项
6.1 空指针(Null Pointer)
-
定义:指向内存地址为
NULL
的指针。 -
特点:不能对空指针进行解引用操作。
int *p = NULL; // *p = 10; // 错误,不能解引用空指针
6.2 野指针(Dangling Pointer)
-
定义:指向未分配或已释放内存的指针。
-
特点:使用野指针会导致程序崩溃或不可预知的行为。
int *p; // 未初始化,指向未知地址 int *p = (int *)0x1100; // 随意赋值,可能非法 int *p = new int(5); delete p; // 释放内存 p = NULL; // 避免成为野指针
7. 总结
常量指针、指针常量和指向常量的常指针本质上都是指针,只是由于 const
关键字所约束的范围不同,导致它们在修改指针本身或指针所指向的数据时受到不同的限制。
- 常量指针(
const int *p
):const
修饰的是指针所指向的数据,因此不能通过指针修改数据,但可以改变指针的指向。 - 指针常量(
int *const p
):const
修饰的是指针本身,指针的指向不可改变,但可以修改指针所指向的数据。 - 指向常量的常指针(
const int *const p
):const
同时修饰指针和指向的数据,既不能改变指针的指向,也不能修改指针所指向的数据。