C++中的指针数组

数组和指针在C++中密切相关。在C++中,数组的名称被视为一个指针,即数组的名称包含了第一个元素的地址。C++将数组名视为指向数组第一个元素的地址。例如,如果我们创建一个数组marks,它包含20个整数类型的值,那么marks将包含第一个元素marks[0]的地址。因此,我们可以说数组名(marks)是一个指向数组第一个元素的指针。

让我们通过一个示例来理解这种情况。

#include <iostream>
using namespace std;
int main()
{
    int *ptr;  // 整型指针声明
    int marks[10]; // 整型数组声明
    std::cout << "输入数组的元素:" << std::endl;
    for(int i=0;i<10;i++)
    {
        cin>>marks[i];
    }
    ptr=marks; // marks和ptr都指向相同的元素
    std::cout << "*ptr的值是:" <<*ptr<< std::endl;
    std::cout << "*marks的值是:" <<*marks<<std::endl;
}

在上面的代码中,我们声明了一个整型指针和一个整型数组。我们使用语句ptr=marks将marks的地址赋值给ptr,这意味着变量'marks'和'ptr'都指向同一个元素,即marks[0]。当我们尝试打印ptr和marks的值时,它们的值相同。因此,证明了数组名存储了数组第一个元素的地址。

输出结果:

1.png

指针数组

指针数组是一个由指针类型的变量组成的数组,这意味着变量是一个指针,指向某个其他元素。假设我们创建一个包含5个整型指针的指针数组,它的声明如下所示:

int *ptr[5];         // 5个整型指针的数组

在上述声明中,我们声明了一个名为ptr的指针数组,并在内存中分配了5个整型指针的空间。

指针数组的元素也可以通过赋值其他元素的地址进行初始化。让我们通过一个示例来观察这种情况。

int a; // 变量声明
ptr[2] = &a;

在上面的代码中,我们将变量'a'的地址赋值给指针数组的第三个元素ptr[2]。

我们还可以通过解引用指针来获取'a'的值。

*ptr[2];

让我们通过一个示例来理解。

#include <iostream>
using namespace std;
int main()
{
    int ptr1[5]; // 整型数组声明
    int *ptr2[5]; // 整型指针数组声明
    std::cout << "输入五个数字:" << std::endl;
    for(int i=0;i<5;i++)
    {
        std::cin >> ptr1[i];
    }
    for(int i=0;i<5;i++)
    {
        ptr2[i]=&ptr1[i];
    }
    // 打印ptr1数组的值
    std::cout << "这些值是:" << std::endl;
    for(int i=0;i<5;i++)
    {
        std::cout << *ptr2[i] << std::endl;
    }
}

在上面的代码中,我们声明了一个整型数组和一个整型指针数组。我们定义了一个'for'循环,遍历数组ptr1的元素,在每次迭代中,将ptr1的第'i'个元素的地址存储在ptr2的第'i'个位置。

输出结果:

2.png

到目前为止,我们已经学习了整型指针数组。现在,我们将看到如何创建指向字符串的指针数组。

指针数组指向字符串

指向字符串的指针数组是一个字符指针数组,它保存了字符串的第一个字符的地址,也可以说是字符串的基地址。

指向字符串的指针数组与二维字符数组的区别如下:

  • 与二维字符数组相比,指向字符串的指针数组在内存消耗方面更有效,因为指向字符串的指针数组消耗的内存比二维字符数组少。
  • 在指针数组中,操作字符串比2D数组更容易。我们还可以使用指针轻松更改字符串的位置。

让我们看看如何声明指向字符串的指针数组。

首先,我们声明指向字符串的指针数组:

char *names[5] = {"john",  
                  "Peter",  
                  "Marco",  
                  "Devin",  
                  "Ronan"};  

在上面的代码中,我们声明了一个大小为5的指针数组names。在上述情况下,我们在声明时进行了初始化,所以不需要提供指针数组的大小。上面的代码也可以这样重写:

char *names[] = {"john",  
                  "Peter",  
                  "Marco",  
                  "Devin",  
                  "Ronan"};  

在上述情况下,'names'数组的每个元素都是一个字符串字面值,每个字符串字面值保存了字符串的第一个字符的基地址。例如,names[0]包含字符串"john"的基地址,names[1]包含字符串"Peter"的基地址,依此类推。不能保证所有的字符串字面值都存储在连续的内存位置,但是字符串字面值的字符是存储在连续的内存位置上的。

让我们创建一个简单的示例。

#include <iostream>
using namespace std;
int main()
{
    char *names[5] = {"john",  
                      "Peter",  
                      "Marco",  
                      "Devin",  
                      "Ronan"};  
    for(int i=0;i<5;i++)
    {
        std::cout << names[i] << std::endl;
    }
    return 0;
}

在上述代码中,我们声明了一个包含5个字符串字面值的char指针数组,每个字符串的第一个字符都保存了字符串的基地址。

输出结果为:

3.png

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想