将整型指针转换为字符型指针

11

我已经阅读了一些关于将int指针转换为char指针的帖子,但仍然有一个问题让我感到困惑。

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


整数占用四个字节...这取决于平台 - LPs
1
@LPs C 规范保证 sizeof(char) == 1 - Carey Gregory
@CareyGregory 好吧,我的错。我的意思是,在某些架构(DSP)上,一个字节的内存是32位。 - LPs
@LPs 是的,可能是这样。规格说明没有说明一个字节有多少位。 - Carey Gregory
4个回答

12
通过将整型指针转换为字符型指针,它们会指向同一内存地址。该转换操作不改变字符指针所指向的值,而是改变了指针默认解释的方式。当你在表达式“*myIntPtr ”中从int指针读取时,你将得到被解释为多字节int类型值的位置的内容。当你在表达式“*myCharPtr”中从char指针读取时,你将得到被解释为单字节char类型值的位置的内容。另一个指针转换的结果是指针算术。当两个int指针指向同一数组时,将一个指针减去另一个指针将产生int之间的差异。
int a[20] = {0};
int *p = &a[3];
int *q = &a[13];
ptrdiff_t diff1 = q - p; // This is 10

如果将pq转换为char类型,你会得到它们之间的距离,单位是char而不是int

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

演示。


3
int指针指向内存中的整数列表。它们可能是16位、32位或64位,并且可能是大端或小端。通过将指针强制转换为char指针,您可以重新解释这些位作为字符。因此,假设是16位大端整数,如果我们指向两个整数数组,0x4142 0x4300,则指针被重新解释为指向字符串"abc"(0x41是'a',最后一个字节是nul)。但是,如果整数是小端的,同样的数据将被重新解释为字符串"ba"。
现在,出于实际目的,您不太可能想将整数重新解释为ASCII字符串。但是,将其重新解释为无符号字符通常很有用,因此只是一系列原始字节。

1
将指针强制转换只是改变了它的解释方式;它指向的值或数据没有发生任何改变。使用它可能会改变它所指向的数据,就像使用原始指针可能会改变它所指向的数据一样;它如何改变这些数据可能不同(这可能是进行强制转换的目的)。

那么,如果我将两个整数指针x和y转换为字符指针并相减:(char *)x - (char *) y -- 这只是改变了它们的解释方式吗?在这种情况下,我将(Char )x解释为分配给x的内存的第一个字节? - maddie
减去指针本身并没有什么不同;减去它们所指向的内容将会有所不同,就像你所描述的那样(尽管为了混淆事情,哪个字节是第一个在所有系统上都不相同)。 - Scott Hunter
1
如果 xyint *,那么 (char *)x - (char *)y 将等于 (x - y) * sizeof(int)。也就是说,指针减法的结果会被指针所指向的类型的大小所缩小。根据定义,sizeof(char) == 1 - Ian Abbott

1
指针是一种特殊的变量,用于存储另一个变量开始的内存地址。无论该变量是int还是char类型,只要在内存中第一个位的位置相同,那么指向该变量的指针将看起来相同。
区别在于操作该指针时。如果您的指针变量是p并且它是int指针,则p ++会增加它包含的地址4个字节。
如果您的指针是p并且它是char指针,则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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接