将int指针转换为char指针

时间:2016-10-04 14:13:41

标签: c pointers

我已经阅读了几篇关于为char指针投射int指针的帖子,但我仍然对一件事情感到困惑。

据我所知,整数占用了4个字节的内存(在大多数32位机器上?),字符占用内存字节。通过将整数指针转换为char指针,它们是否都包含相同的地址?强制转换操作是否会更改char指针指向的值?即,它只指向整数的前8位而不是全部32位?当我将一个int指针转换为char指针时,我对实际发生了什么变化感到困惑。

4 个答案:

答案 0 :(得分:8)

  

通过将整数指针强制转换为char指针,它们是否都包含相同的地址?

两个指针都指向内存中的相同位置。

  

强制转换操作是否会更改char指针指向的值?

不,它会更改指针指向的默认解释。

当您从表达式int中的*myIntPtr指针读取时,您将获得解释为类型int的多字节值的位置的内容。当您从表达式char中的*myCharPtr指针读取时,您会将该位置的内容解释为类型为char的单字节值。

投射指针的另一个结果是指针算术。当你有两个int指针指向同一个数组时,从另一个中减去一个会产生int s中的差异,例如

int a[20] = {0};
int *p = &a[3];
int *q = &a[13];
ptrdiff_t diff1 = q - p; // This is 10

如果您将pq投射到char,您将获得char s的距离,而不是int s:

char *x = (char*)p;
char *y = (char*)q;
ptrdiff_t diff2 = y - x; // This is 10 times sizeof(int)

Demo.

答案 1 :(得分:1)

投射指针只会改变它的解释方式;不会更改其值或指向的数据。 使用它可能会更改它指向的数据,就像使用原始数据可能会更改它指向的数据一样; 它如何改变数据可能会有所不同(这可能是首先进行投射的重点)。

答案 2 :(得分:1)

int指针指向内存中的整数列表。它们可能是16位,32位或可能是64位,它们可能是big-endian或little endian。通过将指针强制转换为char指针,可以将这些位重新解释为字符。因此,假设16位大端整数,如果我们指向两个整数的数组0x4142 0x4300,则指针被重新解释为指向字符串" abc" (0x41是' a',最后一个字节是nul)。但是,如果整数是小端,则相同的数据将被重新解释为字符串" ba"。

现在出于实际目的,您不太可能想要将整数重新解释为ascii字符串。然而,将其重新解释为无符号字符通常很有用,因此只是一个原始字节流。

答案 3 :(得分:0)

指针是一个特殊变量,用于存储另一个变量开始的内存地址。无论变量是int还是char,如果第一位在内存中的位置相同,那么指向该变量的指针看起来都是一样的。

不同之处在于您操作该指针。如果你的指针变量是p并且它是一个int指针,那么p++将增加它包含4个字节的地址。

如果你的指针是p并且它是一个字符指针,那么p++将增加它包含1个字节的地址。

此代码示例将帮助您理解:

int main(){
    int* pi;
    int i;

    char* pc;
    char c;

    pi = &i;
    pc = &c;

    printf("%p\n", pi);    // 0x7fff5f72c984 
    pi++;
    printf("%p\n", pi);    // 0x7fff5f72c988

    printf("%p\n", pc);    // 0x7fff5f72c977
    pc++;
    printf("%p\n", pc);    // 0x7fff5f72c978
}