Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的数组可以由字符索引吗? void shifttable(字符p[]{ int i,j,m; m=strlen(p); 对于(i=0;i_C_Arrays - Fatal编程技术网

C中的数组可以由字符索引吗? void shifttable(字符p[]{ int i,j,m; m=strlen(p); 对于(i=0;i

C中的数组可以由字符索引吗? void shifttable(字符p[]{ int i,j,m; m=strlen(p); 对于(i=0;i,c,arrays,C,Arrays,我想,t[p[j]]=m-1-j零件,使用字符索引。 有人能解释一下它是如何工作的吗?数组索引操作符被视为*(arr+index) 当二进制+运算符的一个操作数是指针时,另一个操作数必须是整数类型 char是一种整数类型 因此, void shifttable(char p[]) { int i, j, m; m = strlen(p); for (i = 0; i < MAX; i++) t[i] = m; for (j = 0; j &l

我想,
t[p[j]]=m-1-j零件,使用字符索引。

有人能解释一下它是如何工作的吗?

数组索引操作符被视为
*(arr+index)

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


char
是一种整数类型

因此,

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;
}

是一种法律声明。

p[j]
返回
p[]
j
-第个字符的ascii码,该字符稍后用作
t
中的索引(ascii码由编译器扩展为int,请参见整数升级)

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

t[p[j]] = m-1-j;
产出:10

这里tab的ascii值是9,所以[9]将是10。请参阅十进制和十六进制字符的等效值


希望对您有所帮助。

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

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

然而,在使用
char
值作为索引变量时存在一个主要问题:
char
类型在默认情况下可以是有符号的无符号的,因此其值的范围可以包含负值。在代码片段中,如果
t
是一个数组或指向数组开头的指针,则
p
中任何具有负值的字符都将导致访问超出数组边界,这具有未定义的行为

建议提高警告级别,以便编译器诊断隐藏得很好的潜在bug。使用
gcc-Wall
clang-Weverything

为避免此潜在问题,应按以下方式修改代码:

void main()
{
   int a[10];

   a['\t'] = 10;

   printf("%d\n",a[9]);
}
#定义最大值256
int t[MAX];
void可移位(字符p[]{
int i,j,m;
m=strlen(p);
对于(i=0;i

还请注意,
i
j
m
t
数组应具有类型
size\u t
,以处理长度超过
INT\u MAX

的字符串,并添加一个
(INT)
,并且在不更改代码功能的情况下,这段代码是如何命名的@user202729:不太可能。最简单的方法是理解
char
是整数类型,因此是有效的数组索引。
#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;
}