普通常量定义
const type variable = value;
注意:在定义常量(非类成员常量)时,必须要在定义该常量时对其进行初始化。
const int buffer = 256; // 正确
const int temp; // 错误
常量指针与指针常量
常量指针:指针所指向内存的值不可修改,指针所指向的地址可以修改;
int a=10;
int b=20;
const int *p=&a; //定义指针常量,指向int a的地址
// const int *p; p=&a; 也是正确的;
p = &b; //正确,指向的内存地址可以修改
int a=10;
const int *p =&a; //定义指针常量,指向int a的地址
*p = 20; //错误,指向的内存地址中的数据不可以修改
常量指针通常用于以下场景:
- 读取数组、字符串等数据集合,确保这些数据不会被意外修改。
- 在函数参数中,防止函数修改传入的数据。
- 增加代码的可靠性,避免意外修改指针所指向的数据。
常量指针应用于函数中的案例:
#include <iostream>
// 函数声明,接受一个指向常量 double 类型的指针
void printArray(const double *arr, int size);
int main() {
double array[] = {1.1, 2.2, 3.3, 4.4, 5.5};
// 调用函数并传递数组的地址
printArray(array, 5);
return 0;
}
// 函数定义,输出数组中的元素值
void printArray(const double *arr, int size) {
std::cout << "数组中的元素值为:" << std::endl;
for (int i = 0; i < size; ++i) {
std::cout << arr[i] << std::endl;
}
}
注意:
在C++中,数组名可以被隐式转换为指向数组首元素的指针。所以在函数 printArray 中,参数 arr 虽然被声明为指向常量 double 类型的指针,但由于数组名 array 在传递给函数时被转换为指向数组首元素的指针,因此在函数内部可以像访问普通数组一样使用 arr[i] 来访问数组中的元素。这种隐式转换在 C++ 中经常被使用,它允许函数接受数组作为参数,而无需明确指定数组的大小。
指针常量:指针所指向的地址不可修改,指针所指向内存的值可以修改;
int a=10;
int * const p =&a; //定义指针常量,指向int a的地址
*p = 20; //正确,指向的内存地址中的数据可以修改
int a=10;
int b=20;
int * const p =&a; //定义指针常量,指向int a的地址
p = &b; //错误,指向的内存地址不可以修改
注意:
指针常量p不是外部的,必须要在声明时初始化指针常量。
指针常量适用于以下场景:
- 需要保持指针指向固定位置,但可能需要修改该位置数据的情况。
- 减少内存泄漏和野指针的风险。
总结:
常量指针用于保护数据不被修改,而指针常量用于保持指针指向固定位置。