C++ 指针和数组
在本教程中,我们将通过示例了解数组和指针之间的关系。
在 C++ 中,指针是保存其他变量地址的变量。指针不仅可以存储单个变量的地址,还可以存储数组单元格的地址。
考虑这个例子:
int *ptr;
int arr[5];
// ptr 指针存储 arr 数组的死一个元素
ptr = arr;
这里, ptr
是一个指针变量而 arr
是一个 int
数组。代码 ptr = arr;
将数组第一个元素的地址存储在变量中指针.
请注意,我们使用了 arr
代替 &arr[0]
。这是因为两者是相同的。因此,下面的代码与上面的代码相同。
int *ptr;
int arr[5];
ptr = &arr[0];
数组元素的其余元素的地址为: &arr[1]
, &arr[2]
, &arr[3]
,和 &arr[4]
。
指向每个数组元素
假设我们需要使用相同的指针 ptr
指向数组的第四个元素。
在这里,如果 ptr
指向上例中的第一个元素,然后 ptr + 3
将指向第四个元素。例如,
int *ptr;
int arr[5];
ptr = arr;
ptr + 1 等同于 &arr[1];
ptr + 2 等同于 &arr[2];
ptr + 3 等同于 &arr[3];
ptr + 4 等同于 &arr[4];
同样,我们可以使用单个指针访问元素。例如,
// use dereference operator
*ptr == arr[0];
*(ptr + 1) 等同于 arr[1];
*(ptr + 2) 等同于 arr[2];
*(ptr + 3) 等同于 arr[3];
*(ptr + 4) 等同于 arr[4];
假设如果我们已经初始化 ptr = &arr[2];
然后
ptr - 2 等同于 &arr[0];
ptr - 1 等同于 &arr[1];
ptr + 1 等同于 &arr[3];
ptr + 2 等同于 &arr[4];
注: ptr
和 ptr + 1
之间的地址相差 4 个字节。这是因为 ptr
是一个指向 int
数据的指针。并且,在 64 位操作系统中 int
的大小为 4 个字节。
同样,如果 ptr
指针指向 char
类型数据,然后 ptr
和 ptr + 1
之间的地址相差是 1 个字节。这是因为一个 char
的大小是 1 个字节。
示例 1:C++ 指针和数组
// C++ Program to display address of each element of an array
#include <iostream>
using namespace std;
int main()
{
float arr[3];
// declare pointer variable
float *ptr;
cout << "Displaying address using arrays: " << endl;
// use for loop to print addresses of all array elements
for (int i = 0; i < 3; ++i)
{
cout << "&arr[" << i << "] = " << &arr[i] << endl;
}
// ptr = &arr[0]
ptr = arr;
cout<<"\nDisplaying address using pointers: "<< endl;
// use for loop to print addresses of all array elements
// using pointer notation
for (int i = 0; i < 3; ++i)
{
cout << "ptr + " << i << " = "<< ptr + i << endl;
}
return 0;
}
输出
Displaying address using arrays:
&arr[0] = 0x61fef0
&arr[1] = 0x61fef4
&arr[2] = 0x61fef8
Displaying address using pointers:
ptr + 0 = 0x61fef0
ptr + 1 = 0x61fef4
ptr + 2 = 0x61fef8
在上面的程序中,我们首先简单地打印了数组元素的地址。
然后,我们使用指针 ptr
指向 a[0]
的地址, ptr + 1
指向 a[1]
的地址, 等等。
在大多数情况下,数组名称衰减为指针。简单来说,数组名被转换为指针。这就是我们可以使用指针访问数组元素的原因。
但是,我们应该记住,指针和数组是不一样的。
在少数情况下,数组名称不会衰减为指针。
示例 2:用作指针的数组名称
用指针表示法插入数组和显示数组数据的 C++ 程序。
#include <iostream>
using namespace std;
int main() {
float arr[5];
// Insert data using pointer notation
cout << "Enter 5 numbers: ";
for (int i = 0; i < 5; ++i) {
// store input number in arr[i]
cin >> *(arr + i) ;
}
// Display data using pointer notation
cout << "Displaying data: " << endl;
for (int i = 0; i < 5; ++i) {
// display value of arr[i]
cout << *(arr + i) << endl ;
}
return 0;
}
输出
Enter 5 numbers: 2.5
3.5
4.5
5
2
Displaying data:
2.5
3.5
4.5
5
2
这里,
-
我们首先使用指针表示法将用户输入的数字存储到
arr
数组中.cin >> *(arr + i) ;
此代码等效于以下代码:
cin >> arr[i];
请注意,我们没有声明一个单独的指针变量,而是对数组名
arr
使用了指针符号。正如我们已经知道的,数组名
arr
指向数组的第一个元素。所以,我们可以想到arr
就像一个指针一样。 -
同样,我们然后在
for
循环中对arr
使用指针表示法。cout << *(arr + i) << endl ;
这段代码相当于
cout << arr[i] << endl ;