重温《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
- 重温《C++ Primer》笔记八 数组与指针的几个问题
- c++primer笔记之数组与指针的一些总结
- c++primer阅读笔记之数组与指针
- C++primer学习笔记第四章-数组与指针
- 重温《C++ Primer》笔记七 VTABLE与VPTR的实现
- C++Primer--数组、指针
- (c/c++学习笔记八)指针数组和指针的指针
- 爬爬爬之路:C语言(八) 指针与指针数组
- 【C++Primer学习笔记】第4章 数组和指针
- C++Primer笔记(包含string、vector和数组指针)
- C++Primer笔记 第四章 数组和指针
- c++primer学习笔记3 - 数组和指针
- C++Primer笔记3(第四章-数组和指针)
- C++Primer学习笔记4 数组和指针
- C++Primer笔记--数组
- C++Primer 数组和指针
- C++primer第四版第四章数组与指针
- c primer plus 指针与多维数组探究
- magic packet 远程唤醒需填写 IP broadcast address
- MFC类的范例: CArchive
- 结算中少算了全屏炸弹
- javascript验证数据类型
- 有道小词典
- 重温《C++ Primer》笔记八 数组与指针的几个问题
- 如何实现一个不会被杀死的进程
- NYOJ478月老的烦恼(1)
- iOS 字符串、数组、字典基本操作
- Majority Element系列问题
- 网络基础篇(一)--TCP/IP协议族
- JAVA设计模式之享元模式
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- python 自定义异常