指针的概念:指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用一些。与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。
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++的学习中,对指针的理解和把握相当重要,可能很多同学对此感到困惑。我个人感觉指针的...
在下列函数声明中,为什么要同时使用...为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念。我们都知道MYCLASS*的意思:指向某个对象的指针,此对象的类型为MYCLASS。 void func1(MYCLASS *pMyClas
C++指针详解 C++指针详解 C++指针详解 C++指针详解 C++指针详解 C++指针详解
通过本文的学习,读者不仅能够全面理解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++资料,里面介绍了关于指针的各种知识,包括指针的基础,指针与数组,指针与字符串,指针与函数,引用等。