将int指针强制转换为char指针
我读过几篇关于将int指针转换为char指针的文章,但有一件事我仍然感到困惑将int指针强制转换为char指针,c,pointers,C,Pointers,我读过几篇关于将int指针转换为char指针的文章,但有一件事我仍然感到困惑 我知道整数占用四个字节的内存(在大多数32位机器上?),字符占用一个字节的内存。通过将整数指针强制转换为字符指针,它们是否都包含相同的地址?强制转换操作是否会更改char指针指向的值?也就是说,它只指向整数的前8位,而不是全部32位?当我将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。