找回密码
 注册
搜索
热搜: java php web
查看: 1451|回复: 3

[笔记]C++primer学习笔记(4)——指针

[复制链接]
发表于 2009-1-26 21:49:56 | 显示全部楼层 |阅读模式
[笔记]C++primer学习笔记(4)——指针
指针是用于数组的迭代器,建议避免使用指针和数组

指针的定义和初始化
指针的声明方法:
1.

string *pstring;
int *ip1, *ip2; // ip1 and ip2 can point to an int
double dp, *dp2; // dp2 is a ponter, dp is an object: both type double
2.
string* ps; // legal but can be misleading
string* ps1, ps2; // ps1 is a pointer to string, ps2 is a string
string* ps1, *ps2; // both ps1 and ps2 are pointers to string
3.
string* ps1;<BR>string* ps2;

或者是:
string *ps1, *ps2;
避免使用未初始化的指针,这样可能会导致程序崩溃。

指针初始化和赋值操作的约束
把int型变量赋给指针是非法的,尽管int变量的值可能为0,但允许把数值0或者是编译时可获得0值的const量赋给指针。把NULL赋给指针相当于把0值赋给指针
初始化或者是赋值时必须保证类型匹配。

void*指针
可以保存任何类型对象的地址,但它只支持集中有限的操作。不允许void*指针操纵他所指向的对象。

指针的算术操作
指针的算术操作只有在原指针和计算出来的新指针都指向同一个数组元素,或者是指向该数组空间的下一个单元时才是合法的,如果指针指向一对象,我们还可以在指针上加1从而获得指向相邻的下一个对象的指针。

两个指针的减法操作:返回值类型为ptrdiff_t的signed整数。ptrdiff_t是包含在cstddef头文件中的与机器相关的类型。

可以对指向数组元素的指针进行下标操作
int ia[] = {0,2,4,6,8};
int i = ia[0]; // ia points to the first element in ia

int *p = &ia[2]; // ok: p points to the element indexed by 2
int j = p[1]; // ok: p[1] equivalent to *(p + 1),
// p[1] is the same element as ia[3]
int k = p[-2]; // ok: p[-2] is the same element as ia[0]

计算数组的超出末端地址
const size_t arr_size = 5;
int arr[arr_size] = {1,2,3,4,5};
int *p = arr; // ok: p points to arr[0]
int *p2 = p + arr_size; // ok: p2 points one past the end of arr
// use caution -- do not dereference!

对超出末端地址不能进行解引用操作。

和其他的内置类型一样,数组没有成员函数。

指向const对象的指针
1.指针指向const对象,则不允许指针来改变其所指的const值。为了保证这一点,c++规定指向const对象的指针也必须是const的。

const double *cptr; // cptr may point to a double that is const

*cptr = 42; // error: *cptr might be const

2.把一个const对象的地址赋给一个普通的,非const对象的指针也会导致编译时出错。

const double pi = 3.14;
double *ptr = &pi; // error: ptr is a plain pointer
const double *cptr = &pi; // ok: cptr is a pointer to const

3.不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。

4.允许把非const对象的地址赋给指向const对象的指针。

double dval = 3.14; // dval is a double; its value can be changed
cptr = &dval; // ok: but can't change dval through cptr

尽管dval不是const对象,但是任何企图通过指针cptr修改其值的行为都会导致编译时出错,cptr一经定义就不允许改变其所指对象的值,如果该指针恰好指向非const对象,同样必须遵循这个规则。
发表于 2009-1-26 22:33:57 | 显示全部楼层
const的作用是为了防止程序在执行过程中变量产生不可预料的改变,声明变量时必须初始化
回复

使用道具 举报

发表于 2009-1-26 22:08:43 | 显示全部楼层
指针复杂,但是记住一些常用的指针使用就好,一些过于复杂的使用,也不常用,就是有些BT的考官,喜欢拿出来考人,不是做嵌入开发的,个人觉的没必要把指针搞的那么详细
回复

使用道具 举报

发表于 2009-1-26 22:19:02 | 显示全部楼层
我看了指针很难理解,不过继续在看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|软晨网(RuanChen.com)

GMT+8, 2024-9-20 17:46

Powered by Discuz! X3.5

Copyright © 2001-2023 Tencent Cloud.

快速回复 返回顶部 返回列表