C++ Array of Pointers 指针数组

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

让我们通过一个例子来理解这个场景。

例子 (Example)

#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 的值时,结果是一样的。由此证明,数组名存放的是数组首元素的地址。

输出

C++ 指针数组

指针数组

指针数组是由指针类型的变量组成的数组,这意味着该变量是指向其他某个元素的指针。假设我们创建了一个包含 5 个整数指针的指针数组;然后它的声明看起来像:

句法 (Syntax)

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

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

指针数组的元素也可以通过分配其他元素的地址来初始化。让我们通过一个例子来观察这个案例。

句法(Syntax)

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

在上面的代码中,我们将“a”变量的地址分配给数组“ptr”的第三个元素。

我们还可以通过取消引用指针来检索“a”的值。

句法(Syntax)

*ptr[2];

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

例子 (Example)

#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”的元素,并且在每次迭代中,索引“i”处的 ptr1 元素的地址存储在索引“i”处的 ptr2 中。

输出

C++ 指针数组

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

指向字符串的指针数组

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

下面是字符串指针数组和二维字符数组的区别:

  • 在内存消耗方面,字符串指针数组比二维字符数组更高效,因为字符串指针数组比二维字符数组存储字符串占用更少的内存。

  • 在指针数组中,字符串的操作比二维数组更容易。我们还可以使用指针轻松更改字符串的位置。

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

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

例子 (Example)

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

在上面的代码中,我们将一个指针名称数组声明为大小为 5 的 'names'。在上面的例子中,我们在声明的时候就已经完成了初始化,所以我们不需要提及数组的大小 a指针。上面的代码可以重写为:

例子 (Example)

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

在上面的例子中,'names' 数组的每个元素都是一个字符串文字,每个字符串文字将保存字符串第一个字符的基地址。例如,names[0] 包含“john”的基地址,names[1] 包含“Peter”的基地址,等等。不能保证所有字符串文字都存储在连续的内存位置,但字符串文字的字符存储在连续的内存位置。

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

例子 (Example)

#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 指针数组,每个字符串的第一个字符包含字符串的基地址。

输出

C++ 指针数组


  • 使用社交账号登录,本站支持
全部评论(0)