将int指针强制转换为char指针

将int指针强制转换为char指针,c,pointers,C,Pointers,我读过几篇关于将int指针转换为char指针的文章,但有一件事我仍然感到困惑 我知道整数占用四个字节的内存(在大多数32位机器上?),字符占用一个字节的内存。通过将整数指针强制转换为字符指针,它们是否都包含相同的地址?强制转换操作是否会更改char指针指向的值?也就是说,它只指向整数的前8位,而不是全部32位?当我将int指针转换为char指针时,我对实际发生的变化感到困惑 投射指针只会改变它的解释方式;其值或所指向的数据不会发生更改。使用它可能会改变它指向的数据,就像使用原始数据可能会改变它指

我读过几篇关于将int指针转换为char指针的文章,但有一件事我仍然感到困惑


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

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

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

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

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

否,它更改指针指向的默认解释

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

强制转换指针的另一个结果是指针算法。例如,当有两个
int
指针指向同一数组时,从另一个指针中减去一个指针会产生
int
s中的差异

int a[20] = {0};
int *p = &a[3];
int *q = &a[13];
ptrdiff_t diff1 = q - p; // This is 10
如果将
p
q
转换为
char
,则得到的距离是
char
s,而不是
int
s:

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

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


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

指针是一个特定变量,它存储另一个变量开始的内存地址。不管变量是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
}

整数占四个字节。。。这取决于platform@LPsC规范保证
sizeof(char)==1
@CareyGregory好,我的坏。我的意思是,在某些架构(DSP)上,一个字节的内存是32位。@LPs是的,可能是这样。规范没有说明一个字节有多少位。所以,如果我将两个整数指针x和y转换为字符指针,然后减去它们:(char*)x-(char*)y——这只会改变我对它们的解释方式?在本例中,我将(Char*)x解释为分配给*x的内存的第一个字节??减去指针本身不会有任何不同;从你描述的方式来看,减去它们所指向的内容会有所不同(尽管只是为了混淆,在所有系统中哪个字节是第一个并不相同)。如果
x
y
int*
,那么
(char*)x-(char*)y
将等于
(x-y)*sizeof(int)
。即,指针减法的结果按指针指向的对象的大小缩小<根据定义,代码>大小(字符)==1。