指针与数组


2022年9月15日, Learn eTutorial
1747

指针 数组 之间存在着深刻的联系。在许多情况下,指针 数组 实际上可以互换使用。例如,指向数组开头的指针可以使用数组风格的索引或指针算术来访问该数组。

以下面的 C++ 程序为例
 

#include <iostream>
 
using namespace std;
const int MAX = 5;
 
int main () {
   int  var[MAX] = {20, 200, 400, 800, 1000};
   int  *ptr;
 
   // let us have array address in pointer.
   ptr = var;
   
   for (int i = 0; i < MAX; i++) {
      cout << "Address of var will be [" << i << "] = ";
      cout << ptr << endl;
 
      cout << "Value of var will be[" << i << "] = ";
      cout << *ptr << endl;
 
      // point to the next location
      ptr++;
   }
   
   return 0;
}

输出

Address of var will be [0] = 0x7ffd063d4750
Value of var will be[0] = 20
Address of var will be [1] = 0x7ffd063d4754
Value of var will be[1] = 200
Address of var will be [2] = 0x7ffd063d4758
Value of var will be[2] = 400
Address of var will be [3] = 0x7ffd063d475c
Value of var will be[3] = 800
Address of var will be [4] = 0x7ffd063d4760
Value of var will be[4] = 1000

然而,指针和数组并非完全可以互换。

通过一个例子,让我们更清楚地理解这一点


#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main () {
   int  var[MAX] = {10, 100, 200};
 
   for (int i = 0; i < MAX; i++) {
      *var = i;    //  correct syntax
      var++;       // incorrect syntax
   }
   
   return 0;
}
 

虽然在 var 上使用指针运算符 * 是允许的,但更改 var 的值是被禁止的。这是因为 var 不能用作左值,因为它是一个常量,将始终指向数组的开头。

指针数组

通过一个简单的例子,让我们理解指针数组的概念。为此,我们编写一个 C++ 程序,主要使用一组四个整数作为数组。


#include <iostream>
 
using namespace std;
const int MAX = 4;
 
int main () {
   int  var[MAX] = {20, 200, 400, 800};
 
   for (int i = 0; i < MAX; i++) {
   
      cout << "Value of var[" << i << "] = ";
      cout << var[i] << endl;
   }
   
   return 0;
}
 

输出

Value of var[0] = 20
Value of var[1] = 200
Value of var[2] = 400
Value of var[3] = 800

有时我们可能需要保留一个可以存储指向各种数据类型(包括 int、char 等)的指针的数组。

下面提供了指向整数的指针数组的声明。

int *ptr[MAX];

根据此,ptr 是一组 MAX 整数指针。因此,ptr 的每个元素现在都存储一个指向 int 值。下面的示例使用四个整数,它们存储在以下指针数组中


#include <iostream>
 
using namespace std;
const int MAX = 4;
 
int main () {
   int  var[MAX] = {100, 1000, 2000, 3000};
   int *ptr[MAX];
 
   for (int i = 0; i < MAX; i++) {
      ptr[i] = &var[i]; // assign the address of an integer.
   }
   
   for (int i = 0; i < MAX; i++) {
      cout << "Value of var[" << i << "] = ";
      cout << *ptr[i] << endl;
   }
   
   return 0;
}

输出

Value of var[0] = 100
Value of var[1] = 1000
Value of var[2] = 2000
Value of var[3] = 3000

您还可以使用指针数组来保存字符串列表,如下所示。


#include <iostream>
 
using namespace std;
const int MAX = 5;
 
int main () {
const char *names[MAX] = { "Pathu Khan", "Ali Kapoor", "Zera Vishal", "Kara Johar Ali Bose" };

   for (int i = 0; i < MAX; i++) {
      cout << "Value of names will be[" << i << "] = ";
      cout << (names + i) << endl;
   }
   
   return 0;
}

输出

Value of names will be[0] = 0x7fffe86d2910
Value of names will be[1] = 0x7fffe86d2918
Value of names will be[2] = 0x7fffe86d2920
Value of names will be[3] = 0x7fffe86d2928
Value of names will be[4] = 0x7fffe86d2930