重温《C++ Primer》笔记八 数组与指针的几个问题

来源:互联网 发布:淘宝九宫格代码生成器 编辑:程序博客网 时间:2024/05/16 14:50

        数组与指针是类似于vector容器和迭代器的低级复合类型,但是数组与指针比较原始,与计算机硬件比较接近,在使用上比较没有什么限制,因此使用数组与指针比使用vector容器和迭代器要危险得多,但是因为可以使用数组与指针直接操作内存,因此其效率也比较高,所以一般也只在程序需要强调速度的时候才使用数组与指针,但是深入理解数组与指针还是十分必要的。有几个常见的比较混淆的问题。


一、下标和指针

在刚开始学习数组的时候,还没有涉及到其与指针的关系,我们都是规规矩矩地使用下标来访问数组元素,从0到几。但是下标访问的实质是什么呢?下标只能用于数组中吗?当然是NO。

其实,下标操作其实是对左操作数指针的偏移量进行解引用,如下代码:

int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int *begin, *end;begin = array;end = array + 10;array[9] = 44;cout<<begin[-9];
array[9]的实质即为*(array + 9),而begin[-9]的实质即为*(begin - 9)。所以不要把下标操作理解为数组所特有的,记住,下标操作即为取指针偏移量操作


二、void*、0值指针、NULL指针

void*是C++提供的一种特殊的指针类型,它可以保存任何类型对象的地址。如下代码所示:

double obj = 3.14;double *pd = &obj;void *pv = &obj;pv = pd;
void*对象与一地址相关,但是并不清楚在此地址上的对象类型,因此不允许对void*进行解引用操作。如下:

cout<<*pv<<endl;
输出void*指针pv所指向的内容,这个操作是非法的,将提示错误“非法的间接寻址”。

void*指针支持的几种操作:

1、与另一指针进行比较;

2、向函数传递void*指针或从函数返回void*指针。

3、给另一个void*指针赋值。

如果将指针保存为0值,则表示该指针不指向任何对象的地址,可以将地址值为0的地址想成一个什么都不表示的内存区域,如果指向这个表示什么都没有指向。而NULL变量实为0值,因此,把指针初始化为NULL等效与初始化为0值。


三、指针与const限定符

学习指针的时候,老师总是强调一点“指针即地址”,指针关联这两个对象,指针对象指针指向的对象。所以对其添加const限定符有两处,第一处:指针对象,即这个指针对象是一个const变量。如下:

int * const ptr = 0;
const在ptr前面,说明ptr是一个常量,即这是一个const指针,其指向的对象并没有这个限定。

第二处:指针指向的对象。如下:

int const a = 9;int const *ptr = &a;

记法:可以从右往左读,看const在什么前面,const后面的内容即为常量。


三、指针与typedef

typedef可以重命名。如下代码:

typedef string* pstring;const pstring cstr;
cstr变量的类型是什么呢?很可能出现的错误是将第二句读成:const string *cstr;那么cstr将是一个指向常量的指针。但是并不能直接将typedef当作简单的文本扩展,在声明const pstring时,const修饰的是pstring的类型,这是一个指针。所以这里应该读成:string * const cstr;




0 0
原创粉丝点击