【问题标题】:C++, Use [] notation on pointer?C++,在指针上使用 [] 表示法?
【发布时间】:2015-08-23 19:07:39
【问题描述】:

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

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++ arrays pointers operator-keyword


【解决方案1】:

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

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

后缀表达式后跟方括号中的表达式[] 是数组对象元素的下标指定。下标运算符[]的定义是E1[E2]等同于(*((E1)+(E2)))。由于适用于二进制+ 运算符的转换规则,如果E1 是一个数组对象(等效地,指向 数组对象的初始元素)并且 E2 是整数,E1[E2] 指定E1 的第E2 元素(从零开始计数)。

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

后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达式应具有“指向T”的类型,另一个应具有无范围枚举或整数类型。 结果是“T”类型的左值。 “T”类型应该是一个完全定义的对象类型。表达式E1[E2]*((E1)+(E2)) 相同(根据定义)

【讨论】:

  • 好的,谢谢,没有马上找到信息,等待一段时间后会选择这个答案为正确的;)
【解决方案2】:

除了 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;

【讨论】:

    猜你喜欢
    • 2019-02-05
    • 2011-09-18
    • 2013-03-31
    • 1970-01-01
    • 2022-10-07
    • 2020-06-14
    • 1970-01-01
    • 2013-01-27
    • 2011-05-30
    相关资源
    最近更新 更多