C++,在指针上使用 [] 符号?

C++, Use [] notation on pointer?

我刚刚注意到我可以在指针上使用 [] 并且它有效,但我想知道,这是否适合使用它。

int a[]={1,2,3,4};
int *p=&a[1];
std::cout << p[0]; // returns 2;
std::cout << p[-1]; // returns 1;
std::cout << p[1]; // returns 3;

我一直学的,你要这样用:

std::cout << *(p-1); 
std::cout << *(p+1); 

但是可以在指针上使用运算符 [] 吗?

在C/C++中,给定一个指针p和整数值kp[k]被计算为*(p+k)。只要 p+k 指向有效内存,任何一种形式都可以使用。

如果您可以访问 C99 标准,请参阅 6.5.2.1 数组下标部分,第 2 段。它说:

A postfix expression followed by an expression in square brackets [] is a subscripted designation of an element of an array object. The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th element of E1 (counting from zero).

如果您可以访问 C++11 标准,请参阅 5.2.1 下标部分,第 1 段。它说:

A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall have the type “pointer to T” and the other shall have unscoped enumeration or integral type. The result is an lvalue of type “T.” The type “T” shall be a completely-defined object type. The expression E1[E2] is identical (by definition) to *((E1)+(E2))

除了 R Sahu 的精彩回答,您还可以

std::cout << p[-1]; // returns 1;
std::cout << p[1]; // returns 3;

std::cout << 1[p]; // returns 3;
std::cout << (-1)[p]; // returns 1;

参见:Ideone

对于指针p和整数值k

p[k]k[p] 都计算为 *(p+k)。所以,两者是一样的。

但是后面的不一样

std::cout << -1[p]; // returns -3;
std::cout << (-1)[p]; // returns 1;