小朋友学C++(45):指针与数组的关系

时间:2022-06-18
本文章向大家介绍小朋友学C++(45):指针与数组的关系,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

例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()来动态申请/释放内存。