C中的数组可以被字符索引吗?

时间:2018-03-11 05:14:15

标签: c arrays

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;部分是使用字符编制索引的。 有人可以解释一下它实际上是如何工作的吗?

4 个答案:

答案 0 :(得分:1)

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

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

char是一个完整的类型。

因此,

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

是一份法律声明。

答案 1 :(得分:0)

p[j]返回j中的p[]的ascii代码 - t中的字符,稍后将用作<context:property-placeholder location="app.properties"/> 中的索引(ascii代码扩展为int编译器,请参阅整数促销)。

答案 2 :(得分:0)

该字符将转换为等效的ascii值,并充当数组的索引。下面的代码为您提供了一个示例,

void main()
{
   int a[10];

   a['\t'] = 10;

   printf("%d\n",a[9]);
}

输出:10

此处ascii值为9,因此[9]为10.请参阅https://www.asciitable.com/表示十进制和十六进制等效字符。

希望它对你有所帮助。

答案 3 :(得分:0)

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

通过字符值索引对许多算法都很有用,尤其是搜索和单词匹配。 <ctype.h>中函数的典型实现使用257个条目的数组(有时候安全性为384个条目),其中函数参数用作索引。

  

然而,使用char值的索引变量存在一个主要问题:char类型默认情况下可以签名无符号,所以它的值范围可以包含负值。在代码片段中,如果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的字符串。