【问题标题】:casting int pointer to char pointer将 int 指针转换为 char 指针
【发布时间】:2017-02-12 18:08:39
【问题描述】:

我已经阅读了几篇关于将 int 指针转换为 char 指针的帖子,但我仍然对一件事感到困惑。

我知道整数占用四个字节的内存(在大多数 32 位机器上?)而字符占用一个字节的内存。通过将整数指针转换为 char 指针,它们是否都包含相同的地址?强制转换操作是否会更改 char 指针指向的值?即,它只指向整数的前 8 位而不是所有 32 位?当我将 int 指针转换为 char 指针时,我对实际发生的变化感到困惑。

【问题讨论】:

  • 整数占用四个字节 ...取决于平台
  • @LPs C 规范保证sizeof(char) == 1.
  • @CareyGregory 好吧,我的错。我的意思是,在某些架构 (DSP) 上,一个字节的内存是 32 位。
  • @LPs 是的,可能是这样。规范没有说明一个字节有多少位。

标签: c pointers


【解决方案1】:

投射指针只会改变它的解释方式;它的值或它指向的数据不会发生变化。 使用它可能会改变它所指向的数据,就像使用原始可能会改变它所指向的数据一样; 如何改变数据可能不同(这可能是首先进行强制转换的重点)。

【讨论】:

  • 因此,如果我将两个整数指针 x 和 y 转换为 char 指针并减去它们: (char *)x - (char *) y - 这只会改变我解释它们的方式吗?在这种情况下,我将 (Char *)x 解释为分配给 *x 的第一个内存字节?
  • 减去 指针 本身不会有任何不同;以您描述的方式减去它们指向的内容会有所不同(尽管只是为了混淆,在所有系统上哪个字节是第一个并不相同)。
  • 如果xyint *,那么(char *)x - (char *)y 将等于(x - y) * sizeof(int)。 IE。指针减法的结果按指针指向的事物的大小按比例缩小。 sizeof(char) == 1 根据定义。
【解决方案2】:

通过将整数指针转换为 char 指针,它们是否都包含相同的地址?

两个指针都指向内存中的相同位置。

强制转换操作会改变 char 指针指向的值吗?

不,它改变了指针指向的默认解释。

当您从表达式*myIntPtr 中的int 指针读取时,您会返回解释为int 类型的多字节值的位置内容。当您从表达式*myCharPtr 中的char 指针读取时,您会返回解释为char 类型的单字节值的位置内容。

转换指针的另一个结果是指针算术。例如,当您有两个 int 指针指向同一个数组时,从另一个中减去一个会产生 ints 的差异,例如

int a[20] = {0};
int *p = &a[3];
int *q = &a[13];
ptrdiff_t diff1 = q - p; // This is 10

如果你将pq 转换为char,你会得到chars 的距离,而不是ints:

char *x = (char*)p;
char *y = (char*)q;
ptrdiff_t diff2 = y - x; // This is 10 times sizeof(int)

Demo.

【讨论】:

    【解决方案3】:

    int 指针指向内存中的整数列表。它们可能是 16 位、32 位或可能是 64 位,并且可能是大端或小端。通过将指针转换为 char 指针,您可以将这些位重新解释为字符。所以,假设 16 位大端整数,如果我们指向一个由两个整数组成的数组,0x4142 0x4300,指针被重新解释为指向字符串“abc”(0x41 是 'a',最后一个字节是 nul)。但是,如果整数是小端,则相同的数据将被重新解释为字符串“ba”。

    现在出于实际目的,您不太可能希望将整数重新解释为 ascii 字符串。然而,将其重新解释为无符号字符通常很有用,因此只是一个原始字节流。

    【讨论】:

      【解决方案4】:

      指针是一个特定的变量,它存储另一个变量开始的内存地址。不管变量是 int 还是 char,如果第一位在内存中的位置相同,那么指向该变量的指针看起来是一样的。

      不同之处在于您操作该指针的时间。如果您的指针变量是 p 并且它是一个 int 指针,那么 p++ 会将它包含的地址增加 4 个字节。

      如果您的指针是 p 并且它是一个字符指针,那么 p++ 会将它包含的地址增加 1 个字节。

      此代码示例将帮助您理解:

      int main(){
          int* pi;
          int i;
      
          char* pc;
          char c;
      
          pi = &i;
          pc = &c;
      
          printf("%p\n", pi);    // 0x7fff5f72c984 
          pi++;
          printf("%p\n", pi);    // 0x7fff5f72c988
      
          printf("%p\n", pc);    // 0x7fff5f72c977
          pc++;
          printf("%p\n", pc);    // 0x7fff5f72c978
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 2019-10-07
        • 2013-01-10
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多