gpt4 book ai didi

C指向按位和运算符的数组声明的指针

转载 作者:行者123 更新时间:2023-12-03 16:15:33 25 4
gpt4 key购买 nike

我想了解以下代码:

//...
#define _C 0x20
extern const char *_ctype_;
//...
__only_inline int iscntrl(int _c)
{
return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C));
}

它源自obenbsd操作系统源代码中的文件 ctype.h。此函数检查char是ascii范围内的控制字符还是可打印的字母。这是我目前的思路:
  • iscntrl('a')被调用并将'a'转换为其整数值
  • 首先检查_c是否为-1,然后返回0,否则返回...
  • 将未定义指针指向的地址增加1
  • 将此地址声明为指向长度为(unsigned char)((int)'a')的数组的指针
  • 将按位和运算符应用于_C(0x20)和数组(???)

  • 奇怪地,它以某种方式起作用,并且每次返回0时,给定的char _c都不是可打印的字符。否则,当该函数可打印时,它只会返回一个没有特殊意义的整数值。我的理解问题在于第3步,第4步(有点)和第5步。

    感谢您的任何帮助。

    最佳答案

    _ctype_似乎是符号表的受限制的内部版本,我猜+ 1是他们没有费心保存它的索引0,因为那是不可打印的。或者可能他们使用的是1索引表而不是C中的自定义0索引表。

    C标准对所有ctype.h函数都规定了这一点:

    In all cases the argument is an int, the value of which shall be representable as an unsigned char or shall equal the value of the macro EOF



    逐步检查代码:
  • int iscntrl(int _c) int类型实际上是字符,但是需要所有ctype.h函数来处理EOF,因此它们必须是int
  • -1的检查是对EOF的检查,因为它的值为-1
  • _ctype+1是用于获取数组项地址的指针算法。
  • [(unsigned char)_c]只是对该数组的数组访问,在其中进行强制转换可强制执行可表示为unsigned char的参数的标准要求。注意char实际上可以保持负值,因此这是防御性编程。 []数组访问的结果是其内部符号表中的单个字符。
  • 那里是&掩码,用于从符号表中获取一组特定的字符。显然,所有设置了第5位(掩码0x20)的字符都是控制字符。不查看表就没有意义。
  • 设置了第5位的任何内容都将返回被0x20屏蔽的值,该值是非零值。这满足了在 bool 值为true的情况下函数返回非零的要求。
  • 关于C指向按位和运算符的数组声明的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58879670/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com