我已经阅读了几篇关于为char指针投射int指针的帖子,但我仍然对一件事情感到困惑。
据我所知,整数占用了4个字节的内存(在大多数32位机器上?),字符占用内存字节。通过将整数指针转换为char指针,它们是否都包含相同的地址?强制转换操作是否会更改char指针指向的值?即,它只指向整数的前8位而不是全部32位?当我将一个int指针转换为char指针时,我对实际发生了什么变化感到困惑。
答案 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
如果您将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)
答案 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
}