【问题标题】:Can an array in C be indexed by a character?C中的数组可以按字符索引吗?
【发布时间】:2025-12-18 04:40:01
【问题描述】:
void shifttable(char p[]) {
    int i, j, m;
    m = strlen(p);
    for (i = 0; i < MAX; i++)
        t[i] = m;
    for (j = 0; j < m - 1; j++)
        t[p[j]] = m - 1 - j;
}

我认为,t[p[j]]=m-1-j; 部分是使用字符索引的。 有人可以解释一下它的实际工作原理吗?

【问题讨论】:

  • 添加一个(int) 就很清楚了,无需更改代码的功能。
  • 这段代码怎么叫?
  • @user202729:不是真的。最简单的方法是理解char 是一个整数类型,因此是一个有效的数组索引。

标签: c arrays


【解决方案1】:

数组索引运算符被视为*(arr + index)

当二进制+运算符的一个操作数是指针时,另一个操作数必须是整数类型。

char 是一个整数类型。

因此,

t[p[j]] = m-1-j;

是法律声明。

【讨论】:

    【解决方案2】:

    字符将被转换为等效的 ascii 值,并充当数组的索引。下面这段代码给你一个例子,

    void main()
    {
       int a[10];
    
       a['\t'] = 10;
    
       printf("%d\n",a[9]);
    }
    

    输出:10

    这里 tab 的 ascii 值为 9,因此 a[9] 将为 10。请参考 https://www.asciitable.com/ 获取十进制和十六进制等效字符。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      p[j]返回p[]中的j-th字符的ascii码,稍后在t中用作索引(ascii码被编译器扩展为int,见integer Promotions )。

      【讨论】:

        【解决方案4】:

        char 是一个整数类型。它可以用作[] 运算符的索引值。但请注意,t['0']t[0] 不是同一个元素。 '0' 的值取决于平台上使用的编码。大多数环境使用 ASCII 作为源和执行字符集,其中'0' 的值为 48。

        通过字符值建立索引对许多算法都很有用,尤其是搜索和单词匹配。 &lt;ctype.h&gt; 中函数的典型实现使用由 257 个条目组成的数组(为了安全起见,有时是 384 个条目),其中函数参数用作索引。

        然而使用char 值作为索引变量有一个主要问题:char 类型默认可以是signedunsigned,所以它的值可以包含负值。在代码片段中,如果t是一个数组或者一个指向数组开头的指针,那么p中任何带有负值的字符都会导致访问数组边界之外,具有未定义的行为

        建议提高警告级别,以便编译器诊断出这些隐藏的潜在错误的用途。使用gcc -Wallclang -Weverything

        为了避免这个潜在的问题,代码应该这样修改:

        #define MAX 256
        int t[MAX];
        void shifttable(char p[]) {
            int i, j, m;
            m = strlen(p);
            for (i = 0; i < MAX; i++)
                t[i] = m;
            for (j = 0; j < m - 1; j++)
                t[(unsigned char)p[j]] = m - 1 - j;
        }
        

        另请注意,ijmt 数组应具有 size_t 类型以处理比 INT_MAX 更长的字符串。

        【讨论】: