下标或数组索引运算符由“ []”表示。该运算符通常与数组一起使用,以检索和操作数组元素。
这是一个二元或n元运算符,由两部分表示:
- 后缀/主表达式
- 表达
后缀表达式,也称为主表达式,是一个指针值,例如数组或标识符,第二个表达式是整数值。在第二个表达式中,我们还可以包含枚举值。
句法:
postfix-expression[expression];
Example: Ramswarup[10];
Here the Ramswarup is an array and the above
statement print the value which is held by
Ramswarup at index position 10.
下标运算符后跟的主要表达式是指针,它可以是整数值,但必须记住,两个表达式中的一个表达式必须是指针值,而第二个表达式是否是一个指针则无关紧要。是否完整的顺序。
例子:
// CPP program to demonstrate []
// operator
#include
using namespace std;
int main()
{
char name[] = "Ramswarup Tushar Nilesh Subhash";
// Both of the statement prints same thing
cout << name[5] << endl;
cout << 5 [name] << endl;
return 0;
}
a
a
OUTPUT
a
a
解释:
在上面的示例中,由于下标运算符的排他性,两个“ cout”语句都提供了相似的输出。编译器以类似的方式读取两个语句,因此*(name + 5)和*(5+ name)之间没有区别。
正负下标
数组的第一个元素存储在索引0中。C++数组的范围是从array [0]到array [size – 1]。但是,C++支持正负下标。负下标必须位于数组边界之内;否则,结果将无法预测。以下代码显示了正数组和负数组下标:
// CPP program illustrating the
// positive and negative subscripts
#include
using namespace std;
// Driver Method
int main()
{
int intArray[1024];
for (int i = 0, j = 0; i < 1024; i++) {
intArray[i] = j++;
}
// 512
cout << intArray[512] << endl;
// 257
cout << 257 [intArray] << endl;
// pointer to the middle of the array
int* midArray = &intArray[512];
// 256
cout << midArray[-256] << endl;
// unpredictable, may crash
cout << intArray[-256] << endl;
}
512
257
256
0
最后一行中的负下标可能会产生运行时错误,因为它指向的地址-256位置在内存中可能比数组的原点低。指针midArray初始化为intArray的中间;因此,可以(但不建议)同时使用正数和负数数组索引。数组下标错误不会生成编译时错误,但可能会产生不可预测的结果。
我们引入了运算符重载。在这篇文章中,讨论了索引运算符[]的重载。
以下是有关[]重载的一些有用事实。
1)当我们想检查索引越界时,[]的重载可能很有用。
2)我们必须在函数通过引用返回,因为可以将“ arr [i]”之类的表达式用作左值。
以下是C++程序,用于演示数组索引运算符[]的重载。
// Overloading operators for Array class
#include
#include
using namespace std;
// A class to represent an integer array
class Array {
private:
int* ptr;
int size;
public:
Array(int*, int);
// Overloading [] operator to access elements in array style
int& operator[](int);
// Utility function to print contents
void print() const;
};
// Implementation of [] operator. This function must return a
// reference as array element can be put on left side
int& Array::operator[](int index)
{
if (index >= size) {
cout << "Array index out of bound, exiting";
exit(0);
}
return ptr[index];
}
// constructor for array class
Array::Array(int* p = NULL, int s = 0)
{
size = s;
ptr = NULL;
if (s != 0) {
ptr = new int[s];
for (int i = 0; i < s; i++)
ptr[i] = p[i];
}
}
void Array::print() const
{
for (int i = 0; i < size; i++)
cout << ptr[i] << " ";
cout << endl;
}
// Driver program to test above methods
int main()
{
int a[] = { 1, 2, 4, 5 };
Array arr1(a, 4);
arr1[2] = 6;
arr1.print();
arr1[8] = 6;
return 0;
}
1 2 6 5
Array index out of bound, exiting
输出:
1 2 6 5
Array index out of bound, exiting