狡猾的指针表达式(int *)arr

时间:2013-11-17 15:09:15

标签: c

我正在学习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;
}

谢谢

3 个答案:

答案 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数组。

我没有充分研究你的代码以了解它的目的,但几乎可以肯定有更好的方法。