指针

 
指针用于指向单个对象,指针保存的是指向对象的地址
指针的定义和初始化
Int *p1,*p2; //即p1只能指向int 型的对象
Vector<int> *pvec;
String *p3; //理解指针时由右向左读
另一种声明的风格:
Int* p1;//这种声明没有错误,但是容易造成一些误解
Int* p1,p2; //很多人会认为p2也是指针变量,但是p2其实是int型变量
指针可能的取值:
1:保存对象的地址
2:指向某个对象后面的另一对象
3:或者是0值, NULL也等于0
 
指针的初始化和赋值只能是以下四种类型:
1.0值常量表达式 //int *p=0; 或int *p=NULL;   0==NULL
2.类型匹配的对象的地址   //int a;   int *p=&a;
3.另一对象末的下一地址   //int a[2]={1,2}; int *p=a,*p1=p+1;
4.同类型的另一个有效指针   ////int a,b;   int *p=&a; p=&b;
注意事项:
C++无法检测指针是否未被初始化
 
关于void*指针
保存任何类型对象的地址,void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型.
示例代码:
Int obj=1;        Int *p1=&obj;
Void *p=&obj;        P=p1;
Void*指针只支持几种有限的操作:
于另一个指针进行比较.,向函数传递Void*指针或从返回void*指针
,给另一个void*指针赋值,不允许使用void*指针操纵它所指向的对象
 
其实malloc函数的返回类型就是void*     大家申请空间的时候不都用malloc吗?
比如:char*   pchr   =   (char*)malloc(SIZE*sizeof(char));
其实是void*可以赋值给任意类型;而别的类型却不可以赋值给void*
 
指针的操作
通过 * 操作符将获取指针所指的对象,因此可以通过指针改变所指对象的值,例如
int a=0; int *p1=&a; *p1=2; 此时a的值就变成2了
 
指针和引用的比较
区别1:定义时引用必须初始化,而且不能改变此引用所指对象,
        指针定义时可以不用初始化,但是这个行为不好,如果使用未经初始化的指针会导致程序的崩溃.但是指针可以改变其所指对象.
区别2:赋值行为的差异
        对引用进行赋值,是改变所引用的对象的值,而不是使引用与另一对象关联,引一经初始化,就始终指向同一个特定对象
举例说明:
Int a=1024,b=2048;
Int *p1=&a,*p2=&b;
P1=p2; //p1所指对象i1保持不变仍是1024,只是修改了p1指针的值,使其指向另一个不同对象。
Int &r1=a,r2=b; r1=r2; //赋值后r1引用的对象a的值改变了,而非引用本身
 
指向指针的指针
指针占用内存空间存放其值,因此指针的储存地址可存放在指针中。例如
Int a=1;
Int *p1=&a;
Int **p2=&p1;
输出:printf(“%d,%d,%d”,a,*p1,**p2);
 
指针访问数组元素
Int a[]={1,2,3,4};
Int *p=a; //a等价于&a[0] 
Int *p1=a+1; //指向数组中第2个元素,如果把1改为5则错误,因为超过数组范围
Int last = *(p+3); //如果是*p+3,则起含义是对*p的值加3
C++还支持2个指针的减法,返回的结果是2个指针所指向的元素间隔对象的个数,结果可以为负数,正数或0
 
计算数组的超出末端指针并以此来输出数组元素,例如
Const size_t sz=4;
Int a[sz]={1,2,3,4};
For(int *begin=a,*end=a+sz ; begin!=end ; ++begin )
 Cout<<*begin<<endl;
 
指针和const限定符
1.     指向const对象的指针
到目前位置,我们使用指针来修改其所指对象的值.但是如果指针指向const对象,则不允许用指针来改变其所指的const值.为了保证这个特性,C++语言强制要求指向const对象的指针也必须具有const特性:
   const double *p;  //p所指对象的值不能改变,但能改变p所指对象
2.     const指针
除指向const对象的指针外,C++语言还提供了const指针---------本身的值不能修改:
int a=0;
int *const p=&a;  //p 是一个常指针,不能改变指针所指对象,但所指对象a的值能改变
3.指向const对象的const指针
const double pi=3.14159;
const double *const p =&pi; //不能修改p所指向对象的值,也不允许修改该指针的指向
4.指针和typedef
在typedef中使用指针往往会带来意外的结果.下面是一个几乎所有人刚开始都会答错的问题.假设给出以下语句:
typedef string *pstring;
const pstring cstr; 
声明const pstring时,const修饰的是pstring的类型,这是一个指针.因此,该声明语句应该是把cstr定义为指向string类型对象的const指针,这个定义等价于:
string *const cstr;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值