zoukankan      html  css  js  c++  java
  • c++入门之出话指针和地址。

    指针和地址是c和c++中重要的概念,在此,对指针做以下几方面的总结:

    new和delete:

    1 int*point = new int[10];
    2     point[0] = 1;
    3     point[1] = 2;
    4     point[2] = 3;
    5     cout << "point[0] is :" << point[0] << endl;
    6     cout << "the defferent show is:" << *point << endl;
    7     cout << "the point[2] is:" << *(point+2) << endl;
    8     delete[] point;

    通常c语言中定义个数组,都是采用静态分配(不采用malloc函数的情况下),即,我们定义一个数组的大小,比如int num[1000],则不管用不用得到1000个int内存空间,当我们实际上用不到1000的内存空间的时候,则造成了内存空间的浪费。因此采用new 的方式,可以动态的根据实际需要分配内存,当没有用到的时候,则不进行内存分配。当当前任务结束后,可以通过delete来释放该段内存。需要注意的是,new 和delete是成对出现才比较好。这样不会出现内存泄露(搞清楚这个是什么意思)。

    问题2,上段代码中,定义的pont 是一个数组指针,数组指针本质上是一个指向数组的指针,注意区别指针数组。他的本质仍然是一个指针。因此point[0],point[1]访问的是元素,而不是地址。

    tell和&tell:

    1 short tell[10];
    2     cout << "the address of tell is:" << tell+1 << endl;
    3     cout << "the adress of &tell is:" << &tell+1 << endl;

    c语言中数组名就是地址,这是一种共识,具体的讲,数组名指向第一个元素的地址。更进一步的讲,数组名所代表的类型为一个tell[]元素的地址大小;而&tell也是表示地址,且指向的是整个tell数组,如何理解这句话呢,毕竟如果打印tell和&tell,我们会发现,两者的值是相同的。但是上述代码中,我们就可以一见分晓,运行上述代码,得到结果:

    代码运行结果表明:tell +1是tell[1]的地址,而&tell+1则实际上已经超出了tell数组的内存空间,指到了tell[10]的下一个空间。即从本质上讲:

    tell是一个short*型的地址,而&tell 是一个short(*)[10]型的地址。注意short(*)[10]表示的含义:这只是一个指针,指针的类型为指向了一个包含10个元素的数值,而该指针+1引发的操作是使得地址便宜10个元素类型空间的大小。

    更为细节性的东西可以参见下面的知识:

  • 相关阅读:
    Adobe PS
    深入学习二叉树(04)平衡二叉树
    深入学习二叉树(03)二叉查找树
    C 知识点
    实战【docker 镜像制作与使用】
    从0到1了解 CI/CD
    理解Spring 容器、BeanFactory 以及 ApplicationContext
    Java 中 CAS
    volatile 关键字
    JenKins安装
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/9695124.html
Copyright © 2011-2022 走看看