索引运算符对任意指针有啥作用?
Posted
技术标签:
【中文标题】索引运算符对任意指针有啥作用?【英文标题】:What does the index operator do to arbitrary pointers?索引运算符对任意指针有什么作用? 【发布时间】:2021-12-23 13:37:34 【问题描述】:假设我们有
int x = 4;
int *ptr = &x;
我希望ptr[0]
会是ptr
,ptr[1]
会是ptr + 1
,等等。但是,发生了完全不同的事情。我跑了
#include <stdio.h>
int main()
int x = 4;
int* ptr;
ptr = &x;
//ptr vs ptr[0]
printf("ptr: %p\n\n", ptr);
printf("ptr[0]: %p\n\n", ptr[0]);
//ptr + 1 vs ptr[1]
printf("ptr + 1: %p\n\n", ptr + 1);
printf("ptr[1]: %p\n\n", ptr[1]);
//ptr + 5 vs ptr[5]
printf("ptr + 5: %p\n\n", ptr + 5);
printf("ptr[5]: %p\n\n", ptr[5]);
结果是
ptr: 0115FBF4
ptr[0]: 00000004
ptr + 1: 0115FBF8
ptr[1]: CCCCCCCC
ptr + 5: 0115FC08
ptr[5]: 00000001
【问题讨论】:
如果你已经完成了ptr
与&ptr[0]
、&ptr[1]
、&ptr[5]
等,你会看到更符合你预期的东西。
@SteveSummit 比你发人深省的评论。我运行它,发现ptr + 1
与&ptr[1]
相同。但这给我带来了另一个困惑。 ptr[1]
只是从地址 ptr + 1
开始的 4 个连续字节的内容。所以我希望执行&ptr[1]
与执行&6
之类的操作相同,这会导致错误。
【参考方案1】:
ptr[0]
是 *(ptr + 0)
,ptr[1]
是 *(ptr + 1)
,等等。索引计算偏移量和取消引用。您应该收到关于使用 %p
打印非指针内容的警告。
【讨论】:
你说的很有道理。我只是注意到我确实收到了警告。通常当我没有出错时,我会变得很开心,并且不会看其他任何东西哈哈。 @user56202 为减少不必要的快乐,请在使用 gcc 或 clang 时使用-Werror
进行编译,或者在使用微软的编译器时使用/WX
进行编译。 More here
@user3386109 是的,我真的应该开始关注警告了。以上是关于索引运算符对任意指针有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章