原文: https://www.programiz.com/cpp-programming/pointers-arrays

在本文中,您将了解数组与指针之间的关系,并在程序中有效地使用它们。

指针是保存地址的变量。 指针不仅可以存储单个变量的地址,还可以存储数组的单元格的地址。

考虑以下示例:

  1. int* ptr;
  2. int a[5];
  3. ptr = &a[2]; // &a[2] is the address of third element of a[5].

C   指针和数组 - 图1

假设指针需要指向数组的第四个元素,即在上述情况下的第四个数组元素的保存地址。

由于在以上示例中ptr指向第三元素,所以ptr + 1将指向第四元素。

您可能会认为ptr + 1为您提供了ptr的下一个字节的地址。 但这是不正确的。

这是因为指针ptr是指向int的指针,并且int的大小对于操作系统是固定的(int的大小是 64 位操作系统的 4 字节)。 因此,ptrptr + 1之间的地址相差 4 个字节。

如果指针ptr是指向char的指针,则ptrptr + 1之间的地址将相差 1 个字节,因为字符的大小为 1 个字节。


示例 1:C++ 指针和数组

C++ 程序,使用数组和指针显示数组元素的地址

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. float arr[5];
  6. float *ptr;
  7. cout << "Displaying address using arrays: " << endl;
  8. for (int i = 0; i < 5; ++i)
  9. {
  10. cout << "&arr[" << i << "] = " << &arr[i] << endl;
  11. }
  12. // ptr = &arr[0]
  13. ptr = arr;
  14. cout<<"\nDisplaying address using pointers: "<< endl;
  15. for (int i = 0; i < 5; ++i)
  16. {
  17. cout << "ptr + " << i << " = "<< ptr + i << endl;
  18. }
  19. return 0;
  20. }

输出

  1. Displaying address using arrays:
  2. &arr[0] = 0x7fff5fbff880
  3. &arr[1] = 0x7fff5fbff884
  4. &arr[2] = 0x7fff5fbff888
  5. &arr[3] = 0x7fff5fbff88c
  6. &arr[4] = 0x7fff5fbff890
  7. Displaying address using pointers:
  8. ptr + 0 = 0x7fff5fbff880
  9. ptr + 1 = 0x7fff5fbff884
  10. ptr + 2 = 0x7fff5fbff888
  11. ptr + 3 = 0x7fff5fbff88c
  12. ptr + 4 = 0x7fff5fbff890

在上面的程序中,不同的指针ptr用于显示数组元素arr的地址。

但是,可以使用相同的数组名称arr使用指针符号访问数组元素。 例如:

  1. int arr[3];
  2. &arr[0] is equivalent to arr
  3. &arr[1] is equivalent to arr + 1
  4. &arr[2] is equivalen to arr + 2

示例 2:指针和数组

C++ 程序,用于使用指针符号显示数组元素的地址。

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. float arr[5];
  5. cout<<"Displaying address using pointers notation: "<< endl;
  6. for (int i = 0; i < 5; ++i) {
  7. cout << arr + i <<endl;
  8. }
  9. return 0;
  10. }

输出

  1. Displaying address using pointers notation:
  2. 0x7fff5fbff8a0
  3. 0x7fff5fbff8a4
  4. 0x7fff5fbff8a8
  5. 0x7fff5fbff8ac
  6. 0x7fff5fbff8b0

您知道,指针ptr保存地址,表达式*ptr给出存储在地址中的值。

同样,您可以使用*(ptr + 1)获取存储在指针ptr + 1中的值。

请考虑以下代码:

  1. int ptr[5] = {3, 4, 5, 5, 3};
  • &ptr[0]等于ptr*ptr等于ptr[0]
  • &ptr[1]等于ptr + 1*(ptr + 1)等于ptr[1]
  • &ptr[2]等于ptr + 2*(ptr + 2)等于ptr[2]
  • &ptr[i]等于ptr + i*(ptr + i)等于ptr[i]

示例 3:C++ 指针和数组

C++ 程序,用于插入和显示使用指针符号输入的数据。

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. float arr[5];
  5. // Inserting data using pointer notation
  6. cout << "Enter 5 numbers: ";
  7. for (int i = 0; i < 5; ++i) {
  8. cin >> *(arr + i) ;
  9. }
  10. // Displaying data using pointer notation
  11. cout << "Displaying data: " << endl;
  12. for (int i = 0; i < 5; ++i) {
  13. cout << *(arr + i) << endl ;
  14. }
  15. return 0;
  16. }

输出

  1. Enter 5 numbers: 2.5
  2. 3.5
  3. 4.5
  4. 5
  5. 2
  6. Displaying data:
  7. 2.5
  8. 3.5
  9. 4.5
  10. 5
  11. 2