【问题标题】:what is default type in the following code以下代码中的默认类型是什么
【发布时间】:2022-10-04 18:15:07
【问题描述】:

我在 CRC16 生成器中有以下代码

unsigned crc16dnp_byte(unsigned crc, void const *mem, size_t len)

void const *mem 的默认类型是什么?是char pointermemchar pointer? 谢谢

【问题讨论】:

  • “默认类型”是什么意思?一个void const*一种...
  • 变量mem 是一个指向常量数据的指针。而已。 void * 可以指向任何东西,没有“默认”类型。
  • 也许this 可以回答您的问题。
  • 谢谢,所以基本上 void const *mem 是一种类型,指向可以是整数数组的常量数据
  • mem 可以指向int 值的数组、单个struct 对象、struct 对象的数组,甚至是单个double 值。它指向什么并不重要。从名称来看,该函数可能会将其视为指向字节数组的指针。

标签: c


【解决方案1】:

为了讨论,我们可以把const放在一边。它“只是”将mem 指向的对象修改为只读,与底层类型无关。请注意,指针mem 不是恒定的,但这只是挑剔。

现在我们有了一个数据类型为void* 的指针。请注意,C 中没有“默认”类型的概念,所有表达式都有定义的类型。

从函数名来看,这个指针用于计算一个 16 位的循环冗余校验值。这种计算是在要检查的对象的二进制表示上完成的,与它们的数据类型无关。 CRC 背后的理论使用位作为数据的类型。但是,通常计算是用字节完成的,在 C 中由char 表示。

C标准对指针(摘录)说:

指向的指针void可以转换为或从指向任何对象类型的指针转​​换。

当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节。

因此,为了方便起见,作者选择了void*。您可以提供指向任何对象的指针,而无需强制转换或考虑对齐。

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多