为什么地址类型被转换为char *?

时间:2014-04-15 07:06:07

标签: c

我正在阅读其中一个在不使用sizeof()的情况下找出变量大小的实现 以下是实施

int i = 1;
size_t size = (char*)(&i+1)-(char*)(&i);
printf("%zi\n", size);

但我不明白为什么varibale i的地址类型被转换为(char *)而不是(int *)。

任何人都可以帮助我理解这种种姓在这里的运作方式吗?

4 个答案:

答案 0 :(得分:8)

(char*)的强制转换意味着差异是在char 指针算术中计算的。结果size将以char为单位(即字节),这是sizeof的自然单位。

答案 1 :(得分:3)

char的大小保证为1.如果将指针从int转换为char,当你减去两个指针时,你会得到它们之间的不同,这将是以char为单位,而不是int的大小。它有助于计算int的实际大小。

答案 2 :(得分:2)

size_t size = (char*)(&i+1)-(char*)(&i);

这里因为i是整数指针,& i + 1会将指针递增到int类型变量的下一个地址。因此,此增量将导致地址增量乘以存储int数据所需的字节数。但如果直接减去该值,它将给出指针之间的int数据数而不是字节数。因此,要获取您键入的字节数,请将指针强制转换为大小为字节的数据类型 您甚至可以将其转换为整数并获得差异以获得int的大小,即字节数。但它会导致警告,所以不是一个好的做法。

答案 3 :(得分:0)

根据指向的数据类型的大小,加法和减法对指针的行为都不同。 例如,假设在特定计算机的给定编译器中,char占用1个字节,short占用2个字节,long占用4个字节。 假设我们定义了以下变量:

char *pChar;
short *pShort;
long *pLong;

并且我们知道他们分别指向内存位置1000,2000和3000,所以如果我们写:

pChar++;  // As expected, pChar will contain the value 1001
pShort++; // pShort will contain the value 2002, because short type will take 2 bytes
pLong++;  // pLong will contain the value 3004

回到问题中的代码,根据指针算法,变量大小将包含i的大小(在本例中为int),无论转换为(char *)还是(int *)