【问题标题】:What does this do exactly? [*(char*)p1]这到底是做什么的? [*(char*)p1]
【发布时间】:2014-01-29 12:00:45
【问题描述】:

我不习惯指针,因为我从高中开始学习 Pascal,现在我正在升级自己到 C。我的请求是解释我在看到类似 [*(char*)p1] 的内容时应该怎么想。不要害羞给我写几行:)

谢谢。

附: p1 是const void *。为了更准确。

【问题讨论】:

  • 我会说,将p1 转换为char* 并取消引用它(获取该地址的值)。该值被用作数组索引[ ]
  • [[*(char*)p1] 之前应该有一些数组名称。 [*(char*)p1] 单独将是编译器错误,@Damon 也提到了。
  • 我对这个问题的回答可能会帮助您理解这一点。 stackoverflow.com/questions/21034253/…

标签: c pointers char void


【解决方案1】:

假设[*(char*)p1] 是一个数组指示符,(char*) 用于转换p1 以使p1 char * 类型。然后* 用于取消引用它以使用地址(p1 指向)处的值作为某个数组的索引。

【讨论】:

    【解决方案2】:
    1. (char*)p1 是一种类型转换。这意味着,对于此语句,我们将 p1 视为指向字符的指针。
    2. *(char*)p1 取消引用 p1,由于类型转换 (char*),将其解释为 char 类型。一个指针指向一个内存位置,取消引用该指针会返回内存中p1 指向的位置的值。
    3. [*(char*)p1] ... 数组访问?这是来自更大的东西的 sn-p 吗?

    这种void*someOtherType* 的转换在C 代码中很常见,因为用于动态分配内存的malloc 返回void*

    【讨论】:

      【解决方案3】:

      [*(char*)p1] 有点不完整,前面需要一个变量名才能使数组订阅有意义,例如foo[*(char*)p1]

      在这种情况下,它的意思是:

      • 将 p1 转换为指向字符的指针
      • 取消引用此指针(提供char 值)
      • 使用该值作为索引在数组中查找

      请注意,使用char 作为索引会使大多数编译器不满意并导致它发出警告。这是因为大多数情况下,当 char 用作索引时,它是由错误而不是故意发生的,而且因为它是实现定义的 char 是有符号还是无符号(因此它本质上是不可移植的,如果您假设错误,您最终可能会意外索引超出范围)。

      【讨论】:

      • Damon 如果我转换为unsigned char* 然后取消引用,那么它不会在char*-wall 编译器发出警告的地方发出警告。任何意见?我正在使用 GCC
      • @GrijeshChauhan: 转换为unsigned char* 更加更安全,因为它是否已签名(即未签名)是明确定义的,并且您不能意外使用例如当你真的打算使用200时,索引-56。这是一件令人讨厌的事情,否则可能会发生在 GCC 上,其中char 等于signed char。所以编译器不再发出警告,因为除了溢出的风险之外,它非常安全且定义明确。
      【解决方案4】:

      void *p1;// 指向 void 的指针或泛型指针;当您想灵活处理数据类型时可能会使用

      (char*)p1; //类型转换为 char 指针;您将 P1 指向的内存位置寻址为 char

      *(char*)p1; //p1指向的位置的值。

      希望这会有所帮助。

      【讨论】:

      • 这正是我所需要的。谢谢你:)
      猜你喜欢
      • 2013-02-08
      • 1970-01-01
      • 2012-03-30
      • 2012-03-07
      • 1970-01-01
      • 2015-08-06
      • 2013-09-02
      • 2014-01-02
      • 2013-10-10
      相关资源
      最近更新 更多