码迷,mamicode.com
首页 > 其他好文 > 详细

指针(pointer) -- (上)

时间:2015-11-08 13:55:53      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:

引子:

  blog对于学开发实在是个好东东,一年前问一大神儿算法问题,大神给了个神秘链接(后来那是他的blog地址),遂点开看是对该算法的解析,举例释义伪代码c实现代码样样齐全,大喜。后来查资料blog是首先搜素的,习惯用搜索引擎时键入问题的关键词 + blog。现在试着写写blog,水平有限都是些比较基础的东西,可能没有多少人需要,不过记录下成长也是极好的嘛,哈哈^_^。

正题:

指针通常难以理解,很多由指针引发的错误往往很有隐蔽性。所以对于指针的理解和使用就需要尤为严谨。

指针(pointer)是“指向(point to)"另外一种类型的复合类型。作用与引用类似都是实现对其他对象的间接访问。然而两者在具体实现上是完全不同的。其一,指针本身就是一个对象,具有对象的性质(如在内存中占有一席之地、可以赋值拷贝)、指针还可以在生命周期中改变”指向“;而引用的关键的是引用并不是一个对象。其二,指针和其他内置类型一样在不初始化将有一个不确定的值,而引用定义时必须初始化,而且是一旦初始化就不能轻易地改变(因为一些特殊的手法可以绕开这个限制,如果写关于引用的blog时会分享一些特殊方法,这是后话)。

关于定义:类型声明 *变量名;<Type> *d;  //注意的连续定义指针时,每个变量名前都应该有*

int *ip1,*ip2;//ip1与ip2都是int指针

double *dp1,dp2;//dp1是double指针,dp2是double对象


 取地址符(&)与解引用符(*)

关于&:

出两种例外情况(const可以接受非const的值初始化,基类指针可以指向派生类),其他所有指针的类型都要和它所指向的对象严格匹配。

double dval;
double *dp = &dval;    //正确:初始值是double类型对象的地址
double *dp1=dp;        //正确:初始值是dp指向的地址

int *ip=dp;                //错误:指针ip和指针dp的类型不匹配
ip=&dval;                  //错误:试图将double型的对象地址赋给int指针

 因为在·声明语句中指针的类型实际上被用于指定它所指向的对象的类型,所以二者必须匹配。如果指针指向了一个其他类型的对象,对于该对象的操作将会出错。

指针值(四种情况):

1.指向一个对象

2.指向紧邻对象所占空间的下一位置。

3.空指针。

4.野指针,除上述三种情况外的情况(试图访问野指针是危险操作)。

关于*:

int ival = 42;
int *ip=&ival;    //ip指向ival
cout << *ip;    //由符号*得到ip指向的对象,输出42

*ip=0;            //由符号*得到ip指向的对象并改变其值
cout << *ip;    //输出0

 最后一个代码段说明*和&在不同地方出现的作用

int i = 42;
int &r=i;            //    &紧跟随类型名出现,因此是声明的一部分,r是一个引用
int *p;              //    *紧跟随类型名出现,因此是声明的一部分,p是一个野指针
p =&i;              //    &出现在表达式中,是一个取地址符
*p=i;               //    *出现在表达式中,是一个解引用符
int &r1=*p;       //    &是声明的部分,*是一个解引用符

/*
//在声明语句中,&与*的作用在于组成复合类型;在表达式中,它们的角色又转变成运算符。在不同的场景中出//现虽然符号相同,但由于意义截然不同,所以我们完全可以把它当做不同的符号来对待。
*/

 


参考资料:C++ primer (第五版)

 Ps:敲字太慢,写不下去啦。。。。。/(ㄒoㄒ)/~~

指针(pointer) -- (上)

标签:

原文地址:http://www.cnblogs.com/xiaok-redback/p/4946380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!