`
Conviction
  • 浏览: 5873 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++指针

阅读更多

指针的概念:指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问,只是指针结构更通用一些。与迭代器不同的是,指针用于指向单个对象,而迭代器只能用于访问容器内的元素。

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 = &pi;

 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 = &pi;//错误
const double *ptr = &pi;//正确,指向const对象的指针
//不能用void*指针保存const对象的地址,而必须使用const void*类型的指针保存const对象的地址
void *pv = &pi;//错误
const void *pv = &pi;//正确
//允许把非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++指针 数组 内存释放.docx

    C++指针 数组 内存释放 相关说明

    C++指针存储结构

    —概述—线性排序—二进制存放—数据类型和编码—变量和指针—引用—数组—动态存储分配—函数参数传递在内存中的表示概述c++的学习中,对指针的理解和把握相当重要,可能很多同学对此感到困惑。我个人感觉指针的...

    C++指针使用方法

    在下列函数声明中,为什么要同时使用...为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念。我们都知道MYCLASS*的意思:指向某个对象的指针,此对象的类型为MYCLASS。 void func1(MYCLASS *pMyClas

    C++指针详解

    C++指针详解 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++指针介绍.ppt C++指针...

    C++ 指针教材

    C++指针介绍及基本用法,谭浩强版教材演示文档

    C++指针详解(经典,非常详细).docx

    在学习c++的过程中,指针可以说是非常让人头秃了……但是大一的时候 老师给我们分享了这样一个文件,真的是写的非常详细了,看完之后,受益匪浅~~~

    C++指针的简单例子

    C++指针的简单例子,声明一个整型数变量和指向这个变量的指针,打印出对应的值

    C++指针介绍

    这是初学者可以参考的c++资料,里面介绍了关于指针的各种知识,包括指针的基础,指针与数组,指针与字符串,指针与函数,引用等。

Global site tag (gtag.js) - Google Analytics