C++指针

作者: 红色黎明 分类: C++,学习笔记 发布时间: 2012-04-27 09:10

在学C++的时候就对指针的概念理解得很混淆,刚好看了primer,顺便把其中指针的知识做了一些整理。

0、指针的概念
指针用于指向对象。与迭代器一样,指针提供对其所指对象的间接访问。

1、指针变量的定义
String *pstring;         //把pstring定义为一个指向string类型对象的指针变量
String* pstring;        //另一种申明指针的风格
String* ps1,ps2;       //ps2不是指针,只是一个普通的string变量

2、一个有效的指针必然是以下的状态:
1)保存一个特定对象的地址
int ival = 1024;
int *pi = &ival;
2)指向某个对象后面的另一个对象
int *pa = 0;
int ival = 1024;
int *pi = &ival;
pa = pi;                      //现在pa和pi指向了同一个对象,即pa指向了对象(指针pi)后面的另一个对象(ival)。
3)0值
const int zero = 0;
int *pi = zero; or int *pi = 0;
4)另一对象之后的下一地址(类似于超出末端迭代器)
注:避免使用未初始化的指针

3、给指针赋值和通过指针赋值
1)对左操作数进行解引用,修改指针所指对象的值 *pi = “string”;
2)没用解引用,修改的是指针本身的值 pi = &ival;

4、指针和引用的区别
1)引用总是指向某个对象,定义引用时没有进行初始化是错误的。
2)给引用赋值修改的是该引用所关联的对象的值,而给指针赋值修改了指针指向的对象。

//给指针赋值
int ival1 =1024, ival2 = 1024;
int *pi1 = &ival1, *pi2 = &ival2;
pi1 = pi2;                   //pi1所指向的ival1对象值保持不变,但是pi1指向了ival2

//给引用赋值
int &ri1 = ival1, &ri2 = ival2;
ri1 = ri2;
//修改了ri1引用的值ival1对象,而不是引用本身。修改后这两个引用还是分别指向了原来关联的对象,此时这两个对象值相等。

4、使用指针访问数组元素
1)表达式中使用数组名,改名字会自动转换为指向数组第一个元素的指针。
int ia[] = {0,2,4,6,8};
int *ip = ia;                   //ip指向ia[0]
ip = &ia[4];                  //ip指向ia[4]
2)指针的算术操作
ip = ia;
int *ip2 = ip + 4;                    //ip2指向ia[4],即ip后的第四个元素
ptrdiff_t n = ip2 – ip;            //ptrdiff_t为标准库类型,保证足以存放同一数组中两个指针之间的差距。计算结果为两个指针所指向的元素间隔的对象个数。空指针允许减法运算,结果为0

5、指向指针的指针。
指针本身也是可用指针指向的内存对象。指针的存储地址存放在指针中。
int ival = 1024;
int *pi = &ival;
int **ppi = &pi                        //**操作符指派一个指针指向另一个指针。

6、指向const对象的指针
1)C++强制要求指向const对象的指针必须具有const特性,把const对象的地址赋给普通的、非const对象的指针会导致编译错误。
2)允许给const指针重新赋值
const double *cptr;              //const限定了cptr所指向对象的类型,而并非cptr本身,所以允许给cptr赋值。
3)允许把非const对象的地址赋给const指针
4)不能使用指向const对象的指针修改基础对象,如果该指针指向的是一个非const对象,必须用其他方法修改其所指对象的值。本质上来说,由于没有办法分辨cptr所指对象是否为const,系统会把它所指的所有对象都视为const。所以不能修改。但是不能保证指向const的指针所指的对象的值一定不能修改。

7、const指针
1)本身的值不能修改
double *const cptr;
2)指针指向的对象的值能否修改取决于该对象的类型,如果该对象是const,则不能修改,反之是非常量普通对象,则可以修改。

8、指针和typedef
string s;                                         //以下cstr1、cstr2、cstr3是同一种类型。cstr4则是指向const对象的指针。
typedef string *pstring;
const pstring cstr1 = &s;       //const修饰的是pstring的类型,而不是cstr1。
pstring const cstr2 = &s;
string *const cstr3 = &s;
const string *cstr4 = &s;

9、void*指针
可以保存任何类型对象的指针,表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。void*只支持几种有限的操作:与另一个指针进行比较;向函数传递void*指针或从函数返回void*指针,给另一个void*指针赋值,但是不允许使用void*指针操纵它所指的对象。

2条评论
  • 红色黎明

    2012 年 4 月 28 日 下午 6:13

    沙发。

发表评论

电子邮件地址不会被公开。 必填项已用*标注