• 彻底澄清c/c++指针概念


    传统的指针概念教科书上已经写的很详细了,这里作为一些补充

    在声明一个指针变量的时候 

    double  *ptr;

    这是声明了一个ptr的指针变量,ptr本身是地址,它的数据类型是double  *,在变量声明的时候,指针跟数据类型在一起。所以无法这样写

    double  *ptr=42;

    因为你把常数赋给了一个地址变量ptr;

    *ptr = 42;

    这样赋值是可以的, 但是这里的*ptr的上面变量声明double  *ptr中的*ptr有什么关系呢? 其实没有关系,两者一毛钱的关系都没有,

    *ptr里的*变成了个功能性的指向!也就是指向ptr地址的真正变量所在地, 所以当然可以赋值了。

    如果这样声明变量

    double  ptr2=42;

    ptr是实际的值, 既然是实体,总的有个地址存

    &ptr则获取这个值的地址。

    ptr = &ptr2;

    这样是可以的。就讲到这里,重要的是澄清double  *ptr与*ptr的关系,关系一明了 ,其他的一切都很容易推理出来。

        double dd = 3.12;
    
        double & ff =dd;
        std::cout<<ff<<endl;
        std::cout<<&ff<<endl;
    
        std::cout<<dd<<endl;
        std::cout<<&dd<<endl;
        
        double fff =dd;
        std::cout<<fff<<endl;
        std::cout<<&fff<<endl;
    
        std::cout<<dd<<endl;
        std::cout<<&dd<<endl;

    看这一句,double & ff =dd; double &是ff的数据类型,赋值之后,发现讲dd的地址赋给了ff的指针,这句话有点绕,比如我们写成这样 *ff=&dd, 程序就会报错,因为ff本来是实体,就不可以在指向了,那到底怎么理解double &数据类型呢?

    现在我们定义:

    double *ffPoint = &ff;

    那double & ff =dd;可以理解为ffPoint = &dd; 这样ff的本质没有改变,还是实体变量,但是地址却成了dd的地址,现在的ff成了dd的镜像,改变dd和ff中任何一个,dd和ff都会同时变化。 double & ff =dd;代替了double *ffPoint = &ff;这个过程,这样可以省去创建ffPoint指针变量,这样虽然很简洁,但是却变得让新手难以理解,产生混淆。 也可以这样理解, 看这一段程序:

        double dd = 3.12;
        double df = 3.14;
        &df = &dd;

    执行到第三行会报错,因为等号左边不允许出现&, 而*却可以出现在等号的左边;但是我们想将dd的地址赋给df的地址怎么办呢?
    ok,修改第二行为:double &df = dd;
    怎么样,是不是很绕??转变一下思维吧,其实就是将想象中的&df = &dd;变成double &df = dd;为什么c/c++要这样设计,这也不是我们所能左右的了的。

    贴一段测试程序:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string>
    #include<iostream>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        string n;
        double dd = 3.12;
        double  *ptr3;
        double  *ptr = &dd;
        ptr3 = ptr;
        double  ptr2=42;
        //const double d = 32;
        ////ptr = d;
        ptr = &ptr2;
        std::cout<<ptr<<endl;
        std::cout<<*ptr<<endl;
        std::cout<<*ptr3<<endl;
        std::cin>>n;
    }

     ok,现在推广一下,推广到函数

    double *abc(double *d,double e){
     *d=3.33333;
     e = 3.1415926;
     return d;
    }


    这是函数的返回值类型是(int *),也就是说,函数的返回值是个地址,c++的(空格+*)总是很迷惑人。再看看参数,参数d是地址,e是变量实体,所以传参的时候要传对,当概念*d的实体值时,实参的值也改变啦。

    继续看

  • 相关阅读:
    Mybatis总结(mybatis plus待更新)
    maven配置(IDEA)quickstart,IDEA上maven细节配置
    (已解决)C3P0数据库使用配置文件链接,报错:com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
    angular--ng-template&ngTemplateOutlet的用法

    Array.from()和Array.of()用法
    Object.create()
    继承
    Object类型
    剩余参数
  • 原文地址:https://www.cnblogs.com/endsock/p/3220392.html
Copyright © 2020-2023  润新知