C++中数组和指针的类似之处

C++中数组和指针的类似之处

当您声明下面的 int 数组时:

int myNumbers[5];

编译器将分配固定数量的内存,用于存储 5 个整数;同时向您提供一个指向数组中第一个元素的指针,而指针由您指定的数组名标识。换句话说, myNumbers 是一个指针,指向第一个元素( myNumber[0]),以下示例程序演示了这种关系:

#include 
using namespace std;

int main()
{
    // Static array of 5 integers
    int myNumbers[5];

    // Pointer initialized to array
    int* pointToNums = myNumbers;

    // Display address contained in pointer
    cout << "pointToNums = 0x" << hex << pointToNums << endl;

    // Address of first element of array
    cout << "&myNumbers[0] = 0x" << hex << &myNumbers[0] << endl;

    return 0;
}

输出:

pointToNums = 0x004BFE8C
&myNumbers[0] = 0x004BFE8C

分析:

这个程序表明,可将数组变量赋给类型与之相同的指针,如第 9 行所示,这证明了数组与指针类似。第 12 和 15 行表明,存储在指针中的地址与数组第一个元素在内存中的地址相同。这个程序表明,数组是指向其第一个元素的指针。
要访问第二个元素,可使用 myNumbers[1],也可通过指针 pointToNums 来访问,其语法为 *(pointToNums + 1)。要访问静态数组的第三个元素,可使用 myNumbers[2],而要访问动态数组的第三个元素,可使用语法 *(pointToNums + 2)
由于数组变量就是指针,因此也可将用于指针的解除引用运算符( *)用于数组。同样,可将数组运算符( [])用于指针,以下示例程序所示:

#include 
using namespace std;

int main()
{
    const int ARRAY_LEN = 5;

    // Static array of 5 integers, initialized
    int myNumbers[ARRAY_LEN] = {24, -1, 365, -999, 2011};

    // Pointer initialized to first element in array
    int* pointToNums = myNumbers;

    cout << "Display array using pointer syntax, operator*" << endl;
    for (int index = 0; index < ARRAY_LEN; ++index)
        cout << "Element " << index << " = " << *(myNumbers + index) << endl;

    cout << "Display array using ptr with array syntax, operator[]" << endl;
    for (int index = 0; index < ARRAY_LEN; ++index)
        cout << "Element " << index << " = " << pointToNums[index] << endl;

    return 0;
}

输出:

Display array using pointer syntax, operator*
Element 0 = 24
Element 1 = -1
Element 2 = 365
Element 3 = -999
Element 4 = 2011
Display array using ptr with array syntax, operator[]
Element 0 = 24
Element 1 = -1
Element 2 = 365
Element 3 = -999
Element 4 = 2011

分析:

在这个应用程序中,第 8 行声明并初始化了一个包含 5 个 int 元素的静态数组。这个应用程序通过两种可相互替换的方式显示数组变量 myNumbers 的内容。一种是使用数组变量和间接运算符( *),如第 15 行所示;另一种方式是使用指针变量和数组运算符( []),如第 19 行所示。
该程序表明,数组 myNumbers 和指针 pointToNums 都具有指针的特点。换句话说,数组类似于在固定内存范围内发挥作用的指针。可将数组赋给指针,如第 11 行所示,但不能将指针赋给数组,因为数组是静态的,不能用作左值。 myNumbers 是不能修改的。

注意:

使用运算符 new 动态分配的指针仍需使用运算符 delete 来释放,虽然其使用语法与静态数组类似。牢记这一点很重要。
如果忘记这样做,应用程序将泄露内存,这很糟糕。  

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

你可能感兴趣的:(C++编程基础,c++)