【问题标题】:Typecasting of Pointers in C++C++中指针的类型转换
【发布时间】:2020-12-24 20:51:20
【问题描述】:

假设指针大小为 4

#include<stdio.h>
int main()
{
    int arr[] = {10, 20, 30, 40, 50, 60};
    int *ptr1 = arr;
    int *ptr2 = arr + 5;
    printf("Number of bytes between two pointers are: %d", 
                        (char*)ptr2 - (char*) ptr1);
    return 0;
}

输出:20

在这个程序中,为什么在类型转换中将输出打印为 sizeof 指针?为什么不打印 5?

【问题讨论】:

  • 它还应该打印什么?使用调试器,您会得到答案
  • 另外,C 和 C++ 是完全不同的语言
  • 也许你应该解释一下为什么你认为它应该先打印 5。
  • 也许简短的回答是:因为整数是 4 个字节。指针的大小无关紧要。可以是 32 位指针或 64 位指针,它不会改变结果。这仅取决于sizeof(int) 为 4,sizeof(char) 为 1。

标签: c pointers casting


【解决方案1】:

在这个程序中,为什么在类型转换中将输出打印为 sizeof 指针?为什么不打印 5?

char* 的演员就是这样做的。

只要指针的类型为int*ptr2ptr1 之间的偏移量就是5。 当您将指针显式转换为char* 时,您要求程序计算指针之间​​的偏移量,就好像它们是char* 一样。你的程序说,它是20,等于5*sizeof(int)

【讨论】:

    【解决方案2】:

    数组的每个元素在内存中占用 4 个字节的空间。

    因此,可以进行如下计算:

    • 指针之间的字节数 = char_type_cast of (pointer2 - pointer1)
    • 指针大小的空格 = (bytes_between_pointers / 4)
    • 整数大小的空格 = int_type_cast of (pointer2 - pointer1)

    工作代码:

    #include<stdio.h>
    int main()
    {
        int arr[] = {10, 20, 30, 40, 50, 60};
        int *ptr1 = arr;
        int *ptr2 = arr + 5;
        
        
        /* 
          1 pointer = 4 bytes 
      
          Byte-sized spaces = char_type_cast of (ptr2 - ptr1)
            
          Pointer-sized spaces = byte_spaces / 4
            
          Integer-sized spaces = int_type_cast of (ptr2 - ptr1)
        */
      
        int byteSpaces = ((char*)ptr2 - (char*)ptr1);
        int pointerSpaces = (byteSpaces / 4);
        int integerSpaces = ((int*)ptr2 - (int*)ptr1);
        
        
        printf("Pointer 1 = %d\n", *ptr1);
        printf("Pointer 2 = %d\n", *ptr2);
        printf("\nByte sized spaces between two pointers = %d\n", byteSpaces);
        printf("\nPointer sized spaces between pointers = %d\n", pointerSpaces);
        printf("\nInteger sized spaces between pointers = %d\n", integerSpaces);
        return 0;
    }
    

    输出:

    Pointer 1 = 10
    Pointer 2 = 60
    
    Byte sized spaces between two pointers = 20
    
    Pointer sized spaces between pointers = 5
    
    Integer sized spaces between pointers = 5
    

    【讨论】:

      【解决方案3】:

      除了@R sahu 的回答,看看这段代码并通过调试器运行它。你会发现t1 = '\n't2 = '&lt;'。减法是20

      代码:

      #include<stdio.h>
      #include <iostream>
      int main() {
          int arr[] = { 10, 20, 30, 40, 50, 60 };
          int* ptr1 = arr;
          int* ptr2 = arr + 5;
          auto* t1 = ( char* ) ptr1;
          auto* t2 = ( char* ) ptr2;
          std::cout << ( int ) (t1 - t2);
          printf("Number of bytes between two pointers are: %d",
              ( char* ) ptr2 - ( char* ) ptr1);
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        当您对指针进行算术运算时,它会以所指向类型大小的倍数进行运算。因此,以下分配是等价的:

        int* ptr2 = arr + 5;
        int* ptr2 = &arr[5];
        

        无论哪种方式,它都是指向数组arr中第6个元素的指针。

        由于ints 显然每个都是 4 个字节,当您将指针转换为 char*s 并从另一个减去一个时,指针之间的距离以新指向类型的倍数计算- char 的大小,即 1。第 6 个 intarr 的开头之间的差异是 5 * sizeof(int) 或 20 个字节。

        对于指针的一些背景阅读 - 考虑my answer here

        【讨论】:

          猜你喜欢
          • 2020-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-20
          • 2014-08-14
          相关资源
          最近更新 更多