C++Simplify06-指针
来源:岁月联盟
时间:2012-08-15
1. C++指针含义:指针保存的是另一个对象的地址。引用类型
*解引用符(获取所指的对象)&取地址
2. 每个指针都有一个与之关联的数据类型,且该指针只能指向这一种类型的对象。
注意:string* ps1,ps2; 实际上ps1定义为指针,ps2并非指针,只是一个普通的string对象而已。 string* ps1, *ps2; 这样才是定义了两个指针。
3. 指针取值为NULL相当于等于0.未初始化的指针式无效指针(存放一个不确定的地址),程序中避免使用无效指针。所以指针使用前尽量要初始化。
4. void*指针:可以保存任何类型对象的地址。
操作限制:与另一个指针进行比较;
向函数传递void*指针或从函数返回void*指针;
给另一个void*指针赋值。
不允许使用void*指针操作它所指的对象。
5. 区分给指针赋值和通过指针进行赋值
a)如果对做操作数进行解引用,则修改的是指针所指对象的值;
例如:string s1(“hello”); string *sp1 = &s1;
string s2(“world”); *sp1 = s2;
此时指针sp1中所存的地址依旧s1的地址,但修改了s1的值此时s1=”wolrd”;
b)如果没有使用解引用操作,则修改的是指针本身的值。
例如:string s1(“hello”); string *sp1 = &s1;
string s2(“world”); sp1 = &s2;
此时指针sp1中所存的地址由s1的地址变为了s2的地址,s1值不改变。
6. 区分指针和引用
引用总是指向某个对象,定义时必须初始化。而且引用被赋值是修改该引用所关联的对象的值,并不是使引用和另一个对象关联。
例如:int &ri = ival; int&ri2 = ival2;
ri = ri2; //此时只是将ival的值修改成了和ival2相同而已。ri依旧是引用的ival
7. 二重指针:指向指针的指针。
int ival = 1024; int *p = &ival; int **pp = &p;
此时p中存的是ival的内存地址,pp中存的是指针p的地址。两次解引用得到ival的值
例如:**pp == ival; 这是成立的。
以此类推:还有三重指针等,当然不常用了,使用时要小心。
8. 指针与数组
a) C++中使用数组名,自动转换为指向数组第一个元素的指针。
b) 如果有int arr[5] = {0,1,2,3,4}; int*p = arr;
指针p进行加减操作即改变所指元素,加1为指向下一个元素,减1为指向上一个元素(注意防止越界)。++、-- 操作同理。
c) 两个指向同一数组的指针可以做减法操作。例如:int *p2 = &arr[4];
则,p2 – p1==4;成立。减法操作结果为ptrdiff_t类型(是signed整型,可以是负数)。
d) 允许指针加减0.两个空指针相减结果仍为0.
e) 数组的下标运访问元素时,实际上是对指向数组元素的指针做下标操作。
f) C++允许计算数组或对象的超出末端的地址,但不允许对此地址进行解引用操作。而计算数组超出末端位置之后或数组首地址之前的地址都是不合法的。常用数组末端的下一个元素做“哨兵”。
9. 指针和const限定修饰符
a) const int *p; //p不是const的。可以不初始化p,可以更改p指向的对象;
b) 不能用void*指针保存const对象的地址,必须用const void*指针保存const对象的地址
c) 允许把非const对象的地址赋给指向const对象的指针,但是不能通过p更改指向对象的值:
int a = 3; p = &a;
a=4;//可以 *p = 5;//错误
d) const指针:指针一旦初始化不能再更改指向的对象
int c = 8; int*const cp = &c;
cp只能指向c不能再指向别的对象,可以通过cp更改c的值
e) 指向const对象的const指针:既不能修改指针所指对象的值,也不允许指针再指向别的对象:
const int d = 6; constint *const dp = &d;
int c = 9; dp =&c; //错误 *dp = 7; //错误
f) 注意陷阱:typedefstring *pstring;
const pstring cstr;
cstr的真正类型是:string *const cstr; 而不是const string *cstr;
作者:TskyFree
上一篇: poj 3581 Sequence
下一篇:素数专题