• 指针与数组的关系


    数组名称实际上相当于一个指针,指向数组第一个元素所在的地址。

    例1 用指针方式输入输出数组元素

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int n;
        cin >> n;
        int a[n];
        for(int i = 0; i < n; i++)
        {
            // 挨个赋值
            // p + i表示指针的位置挪动了i * sizeof(int)个内存地址,即指向了第i个元素
            cin >> *(a + i) ;
        }
    
        for(int i = 0; i < n; i++)
        {
            cout << *(a + i) << endl;
        }
    
        return 0;
    }
    

    运行结果:

    3
    10 20 30
    10
    20
    30
    

    分析:
    在这个例子里,a既是数组名称,也代表指向第一个元素的指针。
    a + 0 = a表示第一个元素a[0]的地址,a + 1表示第二个元素a[1]所在的地址。a + 2表示第三个元素a[2]的地址。
    (a + 0) = a[0],(a + 1) = a[1],*(a + 2) = a[2]。
    注意,这里a + 1不是表示a的地址直接加1,而是表示下一个元素的地址,即a指向的地址 + 1 * sizeof(元素类型)。
    假设a[0]的地址为0x00000020,则
    a = 0x00000020;
    a + 1 = 0x00000020 + 1 * 4 = 0x00000024;
    a + 2 = 0x00000020 + 2 * 4 = 0x00000028。
    这里之所以要乘以4,是因为每个整型数据占4个字节的内存。如果是字符型数组,那么应该乘以1,如果是double型数组,那么应该乘以8。

    例2:动态申请内存

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int n;
        cin >> n;
        int *a = new int[n]; // 用new动态申请内存
        for(int i = 0; i < n; i++)
        {
            cin >> *(a + i);
        }
    
        for(int i = 0; i < n; i++)
        {
            cout << *(a + i) << endl;
        }
    
        delete a;           // 释放内存
    
        return 0;
    }
    

    运行结果:

    3
    10 20 30
    10
    20
    30
    

    分析:
    这里使用了new来申请内存,delete来释放内存。这是动态申请内存的方式。而int a[3];则是静态申请内存的方式。
    动态申请内存的方式,当你使用delete释放后,这块内存就可以另做它用了。而静态申请的内存,若是为局部变量申请的内存,则等当前函数执行完后,内被释放;若是为全局变量申请的内存,则等整个程序运行结束后,内存才会被释放。
    所谓“动态”,就是“随时申请,随时释放”的意思。
    C++用new/delete来动态申请/释放内存,C语言则用malloc()/free()来动态申请/释放内存。



  • 相关阅读:
    MySQL数据库索引相关
    springMVC架构说明
    @responseBody注解的使用
    springMVC配置
    17_10_31 ./ ../ / ~/
    Nginx的简单操作
    MySQL中sql语句的优化
    Mac下Redis的简单操作
    github下载与安装(windows版)
    结合工程实践选题调研分析3个同类软件产品
  • 原文地址:https://www.cnblogs.com/alan-blog-TsingHua/p/10867089.html
Copyright © 2020-2023  润新知