#include <stdio.h>
int main()
{
int a, b, c, d;
char *p = (char *)0;
int *q = (int *)0;
float *r = (float *)0;
double *s = 0;
a = (int) (p+1);
b = (int) (q+1);
c = (int) (r+1);
d = (int) (s+1);
printf("%d %d %d %d", a, b, c, d);
return 0;
}
运行它后,它会输出
1 4 4 8
从输出中,我假设它给出了数据类型(char,int,float和double)的大小作为输出。但是我不知道如何。有人可以解释这个程序吗? (char *)0是什么意思? (int)(p + 1)是做什么的?
谢谢。
答案 0 :(得分:4)
(char *)0
是什么意思?
它将0
转换为指针。虽然没有必要。您本可以使用
char *p = 0;
或
char *p = NULL;
(int)(p+1)
的作用是什么?
p+1
求值为指针值。 (int)
部分将指针强制转换为int
。它在某些平台上有效,因为p
和p+1
之间的数值差为sizeof(*p)
。
但是,请注意,这是未定义的行为。不要在生产代码中使用它。使用标准支持的机制来获取类型的大小-sizeof(type)
。
int a = sizeof(char);
int b = sizeof(int);
int c = sizeof(float);
int d = sizeof(double);
printf("%d %d %d %d", a, b, c, d);
通过使用sizeof
作为变量,可以保留size_t
求值的类型。
size_t a = sizeof(char);
size_t b = sizeof(int);
size_t c = sizeof(float);
size_t d = sizeof(double);
printf("%zu %zu %zu %zu", a, b, c, d);
答案 1 :(得分:0)
在C中,指针和整数是可互换的。所以:
(char *)0
告诉编译器将int
0视为指向char
的指针的地址。然后,它将其分配给p
的指针char
。
C允许指针算术,因此表达式p+1
计算出地址,编译器将在char
之后放置另一个p
。 p
和p+1
的地址之间的差异应为 1 char
的大小,以字节为单位。
为确保C在打印输出时将其识别为int
,分配a = (int) (p+1);
将p+1
(地址)强制转换为int
。实际上,这就是char
的大小。
答案 2 :(得分:0)
让我们分析每个部分:
char *p = (char *)0;
将创建一个图表指针并将其初始化为0。这里的(char *)
将0强制转换为字符地址。因此指针p
指向地址0。
a = (int) (p+1);
(p+1)
是0
(p的当前类型)在当前地址(char*
)之后的下一个地址。 (int)
再次用于演员表。对于每种类型,它都会给出大小,因为它的值是第一个地址和第二个地址之间的距离。