C++指针核心用法详解:声明、运算与常量指针区分
C++中的指针是存储内存地址的变量,能够直接操作内存数据。本文将系统讲解指针的声明与解引用、地址运算规则,重点辨析常量指针与指向常量的指针的区别,并展示指针在函数传参、返回值及类成员访问(this指针)中的实际应用场景。
指针基础:声明与解引用
指针本质上是一个存放内存地址的变量。在使用前必须明确其指向的数据类型,以确保正确的内存偏移和读写操作。
第1步:正确声明指针变量
目的:建立指针变量与目标数据类型的关联。
入口:C++源文件编辑器。
动作:使用 datatype* 语法声明指针,并使用取地址运算符 & 获取变量地址进行初始化。
重要参数:
*表示当前变量是指针。&是取地址符,返回变量在内存中的起始地址。
int num = 0;
int* pnum = # // &num 表示 num 变量的内存地址,pnum 指向该地址
第2步:解引用获取或修改值
目的:通过指针访问其所指内存中存储的实际数据。
动作:在指针变量名前加 * 进行解引用。
int num = 1024;
int* pnum = #
cout << *pnum << endl; // 输出 1024,即 num 的值
指针运算与变量修改
指针支持加法与减法运算,但运算结果取决于指针指向的数据类型大小,而非单纯的字节数。
第3步:执行指针地址运算
目的:实现指向数组元素或其他相邻内存块的移动。
动作:对指针变量进行加法操作。编译器会自动将加数乘以该数据类型的大小。
int num = 1024;
int* pnum = #
// 打印初始地址
cout << pnum << " ";
// 指针后移 sizeof(int) 个单位(通常是一个 int 的大小)
pnum = pnum + sizeof(int);
cout << pnum; // 地址发生变化,如从 0x61ff08 变为 0x61ff18
注意:虽然示例中使用了 pnum + sizeof(int),但在常规编程中,若 pnum 是 int* 类型,pnum + 1 等同于向后移动一个 int 的长度。示例中的写法是为了直观展示地址偏移,具体数值因编译器和平台而异。
第4步:通过指针修改变量
目的:间接修改目标变量的值。
动作:解引用后进行操作。需注意运算符优先级,建议加括号明确意图。
int num = 1024;
int* pnum = #
(*pnum)++; // 先解引用再自增,num 变为 1025
// 若写成 *pnum++,则等价于 *(pnum++),指针会指向下一个内存位置,可能导致未定义行为
常量指针与指向常量的指针
理解 const 关键字的位置是区分这两者的关键:const 放在 * 左侧修饰值,放在右侧修饰指针本身。
第5步:声明常量指针(Pointer to Constant)
定义:指针指向的数据不可通过该指针修改,但指针本身可以指向其他地址。
声明格式:const datatype* ptr; 或 datatype const* ptr;
int num = 100;
const int* pnum = #
// num = 64; // 允许,因为原变量可改
// *pnum = 100; // 错误!不能通过指针修改值
第6步:声明指向常量的指针(Constant Pointer to Non-Constant)
定义:指针一旦绑定到一个地址,就不能再指向其他地址(相当于“只读地址”),但该位置的内存内容可以通过指针修改(除非内容本身也是 const)。
声明格式:datatype* const ptr;
关键点:声明和初始化必须在同一行完成,因为赋值操作无法改变指针的指向。
int num = 1024;
int* const pnum = # // 指针不可更改
// pnum = &other_var; // 错误!常量指针不可重新赋值
*pnum = 2048; // 正确!可以修改所指内存的值
注:数组名在表达式中通常退化为指向首元素的常量指针,其地址不可被重新赋值。
指针在函数中的应用
第7步:指针作为函数参数(传址调用)
目的:在函数内部修改外部变量的值,或通过指针访问大数据结构避免拷贝开销。
void change(int* p) {
(*p)++; // 解引用并修改原值
}
int main() {
int num = 1024;
change(&num); // 传入地址
cout << num; // 输出 1025
return 0;
}
第8步:指针作为函数返回值
目的:返回动态分配的内存地址或数组指针。
int* movePointer(int* p) {
p = p + 1; // 指针向后移动一位
return p;
}
int main() {
int list[] = {1, 2, 3};
int* plist = list; // 指向第一个元素 1
plist = movePointer(plist);
cout << *plist << endl; // 输出 2,现在指向第二个元素
return 0;
}
第9步:this 指针访问成员变量
目的:在类的成员函数中区分参数名与成员变量名,或显式调用对象方法。
class Circle {
public:
double r;
// 构造函数
Circle(double r) {
this->r = r; // 使用 this 指针指向当前对象的成员 r
}
};
以上就是C++指针核心用法详解的全部内容,更多关于C++指针编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









