C++中指针变量的使用指南 指针是C中的一个核心概念它存储的是内存地址而不是实际的值。理解指针对于掌握C编程至关重要。1. 基本概念指针的定义和声明12intx 10;// 普通变量int*ptr x;// 指针变量存储x的地址*表示声明一个指针是取地址运算符ptr存储的是x的内存地址*ptr是解引用获取该地址存储的值2. 指针的基本操作1234567891011121314151617#include iostreamusingnamespacestd;intmain() {intx 10;int*ptr x;// ptr指向xcout x的值: x endl;// 输出: 10cout x的地址: x endl;// 输出: x的地址cout ptr的值: ptr endl;// 输出: x的地址cout *ptr的值: *ptr endl;// 输出: 10*ptr 20;// 通过指针修改x的值cout 修改后x的值: x endl;// 输出: 20return0;}3. 指针类型空指针123int*ptr nullptr;// C11及以后推荐int*ptr 0;// 传统方式int*ptr NULL;// C风格不推荐在C中使用悬空指针野指针指向已释放内存的指针使用会导致未定义行为1234int*ptr newint(10);deleteptr;// ptr现在成为悬空指针应该避免使用ptr nullptr;// 好习惯释放后置为空4. 指针运算123456789intarr[5] {1, 2, 3, 4, 5};int*ptr arr;// 指向数组首元素cout *ptr endl;// 输出: 1cout *(ptr 1) endl;// 输出: 2指针加法cout ptr[2] endl;// 输出: 3数组语法ptr;// 移动到下一个元素cout *ptr endl;// 输出: 25. 动态内存分配123456789101112// 分配单个变量int*p newint;// 分配内存*p 100;// 赋值deletep;// 释放内存p nullptr;// 置空// 分配数组int*arr newint[5];// 分配5个int的空间for(inti 0; i 5; i) {arr[i] i * 10;}delete[] arr;// 释放数组内存6. 多级指针123456789intx 10;int*p x;// 一级指针int**pp p;// 二级指针int***ppp pp;// 三级指针cout x endl;// 10cout *p endl;// 10cout **pp endl;// 10cout ***ppp endl;// 107. 指针和函数指针作为函数参数按地址传递123456789101112voidswap(int*a,int*b) {inttemp *a;*a *b;*b temp;}intmain() {intx 5, y 10;swap(x, y);// 传递地址cout x , y endl;// 输出: 10, 5return0;}返回指针的函数123456789int* createArray(intsize) {returnnewint[size];// 返回动态数组的指针}// 注意不要返回局部变量的地址int* badFunction() {intx 10;returnx;// 错误x在函数结束后被销毁}8. 指针和数组123456789intarr[3] {1, 2, 3};// 数组名在多数情况下退化为指针int*ptr arr;// 等价于 int *ptr arr[0];// 通过指针遍历数组for(inti 0; i 3; i) {cout *(ptr i) ;// 输出: 1 2 3}9. const 和指针1234567891011121314151617intx 10;inty 20;// 指向常量的指针不能通过指针修改值constint*ptr1 x;// *ptr1 30; // 错误ptr1 y;// 正确可以改变指向// 常量指针不能改变指向int*constptr2 x;*ptr2 30;// 正确可以修改值// ptr2 y; // 错误// 指向常量的常量指针constint*constptr3 x;// *ptr3 30; // 错误// ptr3 y; // 错误10. 智能指针C11及以上智能指针自动管理内存避免内存泄漏1234567891011#include memory// unique_ptr独占所有权std::unique_ptrint uptr(newint(10));// shared_ptr共享所有权std::shared_ptrint sptr1 std::make_sharedint(20);std::shared_ptrint sptr2 sptr1;// 引用计数增加// weak_ptr弱引用不增加引用计数std::weak_ptrint wptr sptr1;