索引运算符对任意指针有啥作用?

Posted

技术标签:

【中文标题】索引运算符对任意指针有啥作用?【英文标题】:What does the index operator do to arbitrary pointers?索引运算符对任意指针有什么作用? 【发布时间】:2021-12-23 13:37:34 【问题描述】:

假设我们有

int x = 4;
int *ptr = &x;

我希望ptr[0] 会是ptrptr[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&amp;ptr[0]&amp;ptr[1]&amp;ptr[5] 等,你会看到更符合你预期的东西。 @SteveSummit 比你发人深省的评论。我运行它,发现ptr + 1&amp;ptr[1] 相同。但这给我带来了另一个困惑。 ptr[1] 只是从地址 ptr + 1 开始的 4 个连续字节的内容。所以我希望执行&amp;ptr[1] 与执行&amp;6 之类的操作相同,这会导致错误。 【参考方案1】:

ptr[0]*(ptr + 0)ptr[1]*(ptr + 1),等等。索引计算偏移量和取消引用。您应该收到关于使用 %p 打印非指针内容的警告。

【讨论】:

你说的很有道理。我只是注意到我确实收到了警告。通常当我没有出错时,我会变得很开心,并且不会看其他任何东西哈哈。 @user56202 为减少不必要的快乐,请在使用 gcc 或 clang 时使用-Werror 进行编译,或者在使用微软的编译器时使用/WX 进行编译。 More here @user3386109 是的,我真的应该开始关注警告了。

以上是关于索引运算符对任意指针有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的“>>”运算符有啥作用?

c++中的虚函数有啥作用?

% 对 Python 中的字符串有啥作用?

C#运算符大全_各种运算符号的概述及作用

^= 运算符有啥作用?

在C语言中自增自减运算符有啥作用?