【问题标题】:C: int or unsigned int which type I used for pointer increasementC: int 或 unsigned int 我使用哪种类型来增加指针
【发布时间】:2021-02-01 19:23:04
【问题描述】:

对于这种情况:

int arr[] = {0, 1, 2};
void func (int* arr_in){
  int offset_0 = 0;
  int offset_1 = 1;
  int offset_2 = 2;
  printf("%d\n", *(arr_in + offset_0) );
  printf("%d\n", *(arr_in + offset_1) );
  printf("%d\n", *(arr_in + offset_2) );
}

无论我使用的是int还是unsigned,编译器都不会报错。

两个结果似乎也是正确的。

$ clang test.c -Wall -o test

我参考C11草案中的§6.5.6/8章节:

当一个整数类型的表达式被添加到指针或从指针中减去时, result 具有指针操作数的类型。

在草稿中,没有提到“integer”,即(签名)intunsigned

那么两者都可以在所有平台上用于指针操作数

【问题讨论】:

    标签: c pointers integer pointer-arithmetic


    【解决方案1】:

    在此上下文中,“具有整数类型的表达式”指的是 any 整数类型,例如signedunsigned charshortintlonglong long,以及由实现定义的任何其他整数类型。

    因此,您可以安全地将 intunsigned int 类型的参数与指针一起使用,前提是生成的指针仍指向同一个对象或数组。

    【讨论】:

    • 作为对 OP(和其他人)的好奇,使用 negative 索引(或偏移量)是有效的。关于结果指针的相同规定必须仍然成立。
    【解决方案2】:

    请仔细阅读 C 标准。

    来自 C 标准(6.2.5 类型)

    17 char类型,有符号和无符号整数类型,以及 枚举类型统称为整数类型。整数 而真正的浮动类型统称为真正的类型。

    现在您可以重新阅读您对 C 标准的引用

    当添加或减去具有整数类型的表达式时 来自指针,结果具有指针操作数的类型。

    因此,您甚至可以使用既不是有符号整数类型也不是无符号整数类型的char

    【讨论】:

      【解决方案3】:

      int = 1unsigned int = 1 是同一个东西,int = -1ungisned int = -1 不是同一个东西。如果你使用 1、2 和 3,答案是肯定的,你可以“调用”它int , unsigned int 或任何你想要的。如果您希望偏移量为负数,例如您不能使用unsigned int,或者如果您希望偏移量大于2^31,那么您就不能使用unsigned int

      【讨论】:

      • int 边界是否为 2^31−1(不是 2^31)由实现定义。
      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2020-08-16
      • 2017-07-25
      • 2011-08-24
      相关资源
      最近更新 更多