C++教程-C++中的指针数组
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的值时,它们的值相同。因此,证明了数组名存储了数组第一个元素的地址。
输出结果:
指针数组
指针数组是一个由指针类型的变量组成的数组,这意味着变量是一个指针,指向某个其他元素。假设我们创建一个包含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'个位置。
输出结果:
到目前为止,我们已经学习了整型指针数组。现在,我们将看到如何创建指向字符串的指针数组。
指针数组指向字符串
指向字符串的指针数组是一个字符指针数组,它保存了字符串的第一个字符的地址,也可以说是字符串的基地址。
指向字符串的指针数组与二维字符数组的区别如下:
- 与二维字符数组相比,指向字符串的指针数组在内存消耗方面更有效,因为指向字符串的指针数组消耗的内存比二维字符数组少。
- 在指针数组中,操作字符串比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指针数组,每个字符串的第一个字符都保存了字符串的基地址。
输出结果为: