引子:
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ㄒ)/~~