zoukankan      html  css  js  c++  java
  • 指针(pointer) -- (上)

    引子:

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

  • 相关阅读:
    springboot ueditor 使用心得
    利用github和git命令,将本地项目共享到服务器上——第二章
    利用github和git命令,将本地项目共享到服务器上
    如何打造亚秒级加载的网页3——用户体验 总结
    如何打造亚秒级加载的网页2——网络性能 过程解读
    如何打造亚秒级加载的网页1——前端性能
    什么是跨域?怎么解决跨域?
    Vue生命周期
    利用JS实现vue中的双向绑定
    按照vue文档使用JavaScript钩子但是却不能执行动画?
  • 原文地址:https://www.cnblogs.com/xiaok-redback/p/4946380.html
Copyright © 2011-2022 走看看