C ++ указатели против массива
Указатели и массивы тесно связаны между собой. На самом деле, указатели и массивы во многих случаях являются взаимозаменяемыми. Например, указатель на начало массива, массив можно получить доступ с помощью арифметических операций или индексов массива. Рассмотрим следующую программу:
#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指针中的数组地址 ptr = var; for (int i = 0; i < MAX; i++) { cout << "Address of var[" << i << "] = "; cout << ptr << endl; cout << "Value of var[" << i << "] = "; cout << *ptr << endl; // 移动到下一个位置 ptr++; } return 0; }
Когда приведенный выше код компилируется и выполняется, он дает следующие результаты:
Address of var[0] = 0xbfa088b0 Value of var[0] = 10 Address of var[1] = 0xbfa088b4 Value of var[1] = 100 Address of var[2] = 0xbfa088b8 Value of var[2] = 200
Тем не менее, указатели и массивы не являются полностью взаимозаменяемыми. Например, рассмотрим следующую программу:
#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; // 这是正确的语法 var++; // 这是不正确的 } return 0; }
Оператор Указатель * применяется к вар вполне приемлемо, но значение модификации переменная является незаконным. Это происходит потому, что переменная является указателем на начало константного массива, он не может служить в качестве левого значения.
Поскольку имя массива соответствует постоянным указателем, они не меняют значения массива, вы все еще можете использовать форму указателя выражения. Например, следующий допустимый оператор, то переменная [2] 500 Назначение:
*(var + 2) = 500;
Выше утверждение справедливо, и может успешно скомпилировать, потому что переменная без изменений.