指针的概念:指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用一些。与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
string s("hello"); string *sp = &s;
建议:尽量避免使用指针和数组
指针和数组容易产生不可预料的错误。指针用于低级操作,容易产生与繁琐细节相关的错误,现在C++程序采用vector类型和迭代器取代一般的数组,采用string类型取代C风格字符串。
1.指针变量的定义
vector<int> *pvec; int *ip1, *ip2; string *pstring; double *dp;
2.另一种声明指针的风格
string* ps; string* ps1, ps2; //ps1是指针变量,ps2是普通变量 string* ps1, *ps2; //ps1和ps2都是指针变量
3.连续声明多个指针
string* ps1;强调这个声明语句定义的是一个指针
string *ps1, *ps2; 强调对象是一个指针
注意:关于指针的声明,不能说哪种声明风格是唯一的正确方式,重要的是选择一种风格并持续使用
4.应该避免使用未初始化的指针
注意:很多运行时的错误都源于使用了未初始化的指针。如果可能的话,除非所指向的对象已经存在,否则不要先定义指针,这样可以避免定义一个未初始化的指针。如果必须要分开定义指针和其所指向的对象,则将指针初始化为0.因为编译器可检测出0值的指针,程序可判断该指针并未指向一个对象。
5.指针初始化和赋值的约束
int ival; int zero = 0; const int c_ival = 0; int *pi = ival; //错误 pi = zero; //错误 pi = c_ival; //正确 pi = 0; //正确
除了使用数值0或在编译时值为0的const量外,还可以使用C++语言从C语言中继承下来的预处理变量NULL,该变量在cstdlib头文件中定义,其值为0。因此,把指针初始化为NULL等效于初始化为0的值。
注:预处理器变量不是在std命名空间中定义的,因此其名字应为NULL,而非std::NULL。
6.void*指针
C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址:
void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void*指针或从函数返回void*指针;给另一个void*指针赋值。不允许使用void*指针操纵它所指向的对象。
7.指针和引用的比较
(1)引用总是指向某个对象:定义引用时没有初始化是错误的。
(2)赋值行为的差异:给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联。引用一经初始化,就始终指向同一个特定的对象(这就是为什么引用必须在定义时初始化的原因)
int ival = 1024, ival2=2048; int *pi = &ival, *pi2 = &ival2; pi = pi2;
pi所指向的ival对象值保持不变,赋值操作修改了pi指针的值,使其指向另一个不同的对象。
int ival = 1024, ival2=2048; //int *pi = &ival, *pi2 = &ival2; //pi = pi2; int &ri = ival, &ri2 = ival2; ri = ri2;
这个赋值操作修改了ri引用的值ival对象,而并非引用本身。赋值后,这两个引用还是分别指向原来关联的对象,此时这两个对象的值相等。
8.指向指针的指针
int ival = 1024; int *pi = &ival; int **ppi = π
9.使用指针访问数组元素
(1)指针的算术操作
int ia[] = {0,2,4,6,8}; int *ip = ia;//ip指向ia[0] int *ip2 = ip + 4;//ip2指向ia[4] //ptrdiff_t是signed整型,因为ip-ip2 = -4 ptrdiff_t n = ip2 - ip;//结果是4,这两个指针所指向的元素间隔为4个对象
(2)解引用和指针算术操作之间的相互作用
在指针上加上一个整型数值,其结果是指针。
int ia[] = {0,2,4,6,8}; int last = *(ia+4);// ia[4] last = *ia + 4;//ia[0]+4
(3)计算数组的超出末端指针
vector类型提供的end操作将返回指向超出vector末端位置的一个迭代器。这个迭代器常用作哨兵,来处理vector中元素的循环。
const size_t arr_size = 5; int arr[arr_size] = {1,2,3,4,5}; int *p = arr;//p指向arr[0] int *p2 = p + arr_size;//p2指向超出数组末端的位置
(4)输出数组元素
const size_t arr_size = 5; int arr[arr_size] = {1,2,3,4,5}; for(int *pbegin=arr,*pend = arr+arr_size;pbegin!=pend;++pbegin) cout<<*pbegin<<' ';
10.指针和const限定符
(1)指向const对象的指针
如果指针指向const对象,则不允许用指针来改变其所指的const值,为了保证这个特性,C++语言强制要求指向const对象的指针也必须具有const特性。
不能用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址
const double pi = 3.14; double *ptr = π//错误 const double *ptr = π//正确,指向const对象的指针 //不能用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址 void *pv = π//错误 const void *pv = π//正确 //允许把非const对象的地址赋给指向const对象的指针 double dval = 3.14; ptr = &dval;//正确,允许把非const对象的地址赋给指向const对象的指针
(2)const指针
int errNum = 0; int *const curErr = &errNum;//curErr是const指针,curErr是指向int型对象的const指针
(3)指向const对象的const指针
const int errNum = 0; const int *const curErr = &errNum;//curErr是const指针,curErr是指向const int型对象的const指针
11.指针和typedef
typedef string *pstring; const pstring cstr = 0; //const string *cstr;//这样理解错误。 //string *const cstr;//这样理解正确
相关推荐
C++指针 数组 内存释放 相关说明
C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针介绍.ppt C++指针...
c_c++指针详解 c_c++指针详解 希望对大家理解指针有帮助
C++指针精髓 笔记
C++指针.ppt C++指针.ppt
C++指针的几个经典应用,帮助你深入了解C++指针的用法
在网上搜集到的C++指针资料,打包上传上来给大家下
C++ 指针用ppt详细描述,指针是难点,次文章使用ppt描述简单易学
C++ 指针 深入 教程,关于指针的重点难点,深入的讲解
c++指针讲义,是PPT文档。讲解详细,通俗易懂。
对于初学者来讲指针这个东西很烦人,理解起来并不难,但是在实际开发中该如何灵活的使用指针却是个难点。特分享《C/C++指针经验总结——经典教程》,这个教程让你更快更透彻的知晓C++指针的奥秘:)
C_C++指针经验总结.pdfC_C++指针经验总结.pdfC_C++指针经验总结.pdf
C/C++指针详解、学习建议,包含PPT和WORD共三份文档。
关于C++ 指针的讲解 (PS:这个是试试能不能上传)
c++指针数组.rarc++指针数组.rarc++指针数组.rarc++指针数组.rarc++指针数组.rarc++指针数组.rarc++指针数组.rarc++指针数组.rar
C++指针详解 C++指针详解 C++指针详解 C++指针详解 C++指针详解 C++指针详解
c++指针方面的心得
C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码 C++ 指针 实现迷宫 程序代码
C++ 指针讲解 C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解C++ 指针讲解
C++指针C++指针C++指针C++指针C++指针C++指针C++指针C++指针C++指针C++指针C++指针