A,指针的定义初始化和使用
定义:
type *name; //int *p;
初始化:
type *name = &obj //string *name = str1;
避免使用未初始化的指针,如果必须分开指针和其指向的对象,应将指针初始化为0;
初始化和赋值操作的约束
对指针的初始化只能使用一下四种类型的值
1,0值常量表达式,例如在编译时可获得0值的整型const对象或者字面值常量0
const int c_ival = 0;
int *pi = c_ival;
int *pi2 = 0;
2,类型匹配对象的地址
3,另一对象之后的下一地址
4,同一类型的另一个有效指针
使用:&引用操作符 *解引用操作符
string s("hello world");
string *sp = &s;
cout << *sp
B,指针和引用的比较
指针和引用都可以间接访问另一个值,但引用总是指向某个对象,引用没有初始化是错误的。对引用的修改的是该引用所关联的对象的值,而并不是使引用和另一个值相关联。引用一初始化,就始终指向同一个特定的对象。
int ival = 1024 , ival2 = 2048;
int *pi = &ival,*pi2 = &ival2;
pi = pi2 //现在pi指向ival2了
int ival = 1024, ival2 = 2048;
int &ri = ival,&ri2 = ival2;
ri = ri2 // ival的值和ival2的值相等了
C:指针和数组的关系
在表达式中使用数组名是,该名字会自动转换为指向数组的第一个元素的指针
int ia[] = {0,2,4,6,8};
int *ip = ia //ip 指向 ia[0]
1,指针的算术操作
指针加上或者减去一个整型数值n等效于获得一个新的指针,该新指针指向指针原来指向的元素之后或之前的第n个元素。
int ia[] = {0,2,4,6,8};
ip = ia;
int *ip2 = ip+4; //ia[4]
int *ip3 = ip2-2; //ia[2]
int *ip4 = ip3+10 //error
ip3-ip2 //-2
2,解引用和指针算术操作之间的相互作用
int last = *(ia + 4); //ok,last equel the value of ia[4];