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
和整数值k
,p[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;
我刚刚注意到我可以在指针上使用 [] 并且它有效,但我想知道,这是否适合使用它。
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
和整数值k
,p[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 thatE1[E2]
is identical to(*((E1)+(E2)))
. Because of the conversion rules that apply to the binary+
operator, ifE1
is an array object (equivalently, a pointer to the initial element of an array object) and E2 is an integer,E1[E2]
designates theE2
-th element ofE1
(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 expressionE1[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;