在 C++ 中,数组 是用来保存同一种 类型 的一组数据的集合,同时,数组中的所有元素在内存中是连续存放的,也就是数组的每个元素的地址在内存中是连续的。
在 C++ 中,我们可以将数组名看成是一个 指针,它指向数组的第 1 个元素,也就是索引为 0 的元素,在 C++ 中,我们将第 1 个元素的地址称为数组的首地址。
注意,我们可以将数组名看成是指针,但其实它们并不完全等价,因为数组名其实是一个 常量,不可以被修改,而指针时可以移动的,即是一个 变量。
int arr[10];
我们定义了一个含有 10 个元素的数组,数组名为 arr,我们可以认为 arr 是一个指针,其指向了数组的第一个元素。
C++ 的数组名可以看成指针
#include <iostream>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
int arr[3] = {1, 3, 4};
for(int i = 0; i < 3; i++)
{
cout << "arr[" << i << "] = " << arr[i] << endl;
}
return 0;
}
程序运行后,控制台输出如下图所示:
我们首先,定义了一个 int 类型 的数组,该数组有三个元素,接着,我们使用了 for 循环 遍历了这三个元素,既然,数组名可以当做指针,并且数组元素在内存里是连续的。
因此,我们就可以使用数组名来遍历数组元素,我们修改程序如下:
#include <iostream>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
int arr[3] = {1, 3, 4};
for(int i = 0; i < 3; i++)
{
cout << "arr[" << i << "] = " << *(arr+i) << endl;
}
return 0;
}
程序运行后,控制台输出如下图所示:
这次,我们使用了数组名来遍历了数组的每一个元素,我们将数组名当成了指针,并且不停的将指针往后偏移,得到数组元素的地址,再通过 *
符取得数组元素的值。
其中,在 *(arr+i)
这个表达式中,arr 是数组名,指向数组的第 0 个元素,表示数组首地址, arr+i 指向数组的第 i 个元素,*(arr+i)
表示取第 i 个元素的数据,它等价于 arr[i]。
使用指针指向数组名
#include <iostream>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
int arr[3] = {1, 2, 3};
int *pArr = arr;
for(int i = 0; i < 3; i++)
{
cout << "pArr[" << i << "] = " << *(pArr+i) << endl;
}
return 0;
}
程序运行后,控制台输出如下图所示:
我们直接定义了一个指针,其指向了数组名,接着,我们就直接可以通过指针的移动来访问数组中的元素。
使用指针指向数组名
#include <iostream>
using namespace std;
int main()
{
cout << "嗨客网(www.haicoder.net)\n" << endl;
int arr[3] = {1024, 501, 109};
int *pArr = arr;
for(int i = 0; i < 3; i++)
{
cout << "pArr[" << i << "] = " << *pArr++ << endl;
}
return 0;
}
程序运行后,控制台输出如下图所示:
我们使用了指针的自增加上 for 循环,实现了访问数组的所有元素,这里,*pArr++
这种写法,是先使用 *pArr
取出数组的第一个元素,接着,再次执行 pArr++
,就是将指针移向数组的下一个元素。
在 C++ 中,我们可以将数组名看成是一个指针,它指向数组的第 1 个元素,也就是索引为 0 的元素,在 C++ 中,我们将第 1 个元素的地址称为数组的首地址。
注意,我们可以将数组名看成是指针,但其实它们并不完全等价,因为数组名其实是一个常量,不可以被修改,而指针时可以移动的,即是一个变量。