我正在学习c,我发现第18行中的(int*)arr
表达式有困难。整个程序是
int main () {
char c, arr['z'-'a'], *pChar;
int i, *pInt, int matr = 74 ;
for ( c='a'; c<'z'; c++) {
arr[c-'a'] = c;
printf("%c ", arr[c-'a']);
}
printf("\n");
pChar = arr + matr%15;
for (i=0; i< 5; i++) {
printf("%c ", *pChar);
pChar++;
}
printf("\n");
pInt = (int *)arr + matr%2;
for (i=0; i<5; i++) {
pChar = (char *)pInt;
printf("%c ", *pChar);
pInt++;
}
return 0;
}
谢谢
答案 0 :(得分:0)
您将arr
声明为char
类型。作为,数组的名称可以用作指向其第一个元素的指针; arr
是指向数组char
的第一个arr
的指针,其类型为char *
。
对于表达式
pInt
的类型为int *
pInt = (int *)arr + matr%2;
需要在您的计划中将arr
转换为int *
类型。
答案 1 :(得分:0)
在C中,当数组的名称用作值时,它表示第一个元素的地址(&arr[0]
)。
在第一种情况下(第11行),您有pChar = &arr[matr%15]
,因为pChar是char*
在第二种情况下(第18行),您有pInt = (int *) &arr[matr%15]
。你必须将指向char的指针转换为指向int的指针,因为pInt是int*
答案 2 :(得分:0)
其他答案告诉您,您需要使用强制转换将arr
转换为int*
。
更好:不要将arr
转换为int*
。
char c, arr['z'-'a'], *pChar;
int i, *pInt, int matr = 74 ;
如果你自己在一行上声明每个变量,那就更清楚了:
char c;
char arr['z'-'a'];
char *pChar;
int i;
int *pInt;
int matr = 74;
您已将arr
声明为char
的数组。假设ASCII字符集,它有26个字符。你可能希望它有26个。
在大多数上下文中,数组类型的表达式被隐式转换为指向其第一个元素的指针。因此,arr
通常会成为char*
类型的表达式,相当于&arr[0]
。
将char*
指针转换为int*
(需要强制转换)会为您提供指向int
的指针,该指针覆盖数组的第一个sizeof (int)
元素。< / p>
这是一件非常奇怪的事情,它实际上有未定义的行为(arr
不一定具有正确的对齐来存储int
个对象。
如果要存储int
个对象,请声明一个int
数组。
我没有充分研究你的代码以了解它的目的,但几乎可以肯定有更好的方法。