使用C中的指针确定数据类型的大小

时间:2018-07-19 17:29:22

标签: c pointers

#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)是做什么的?

谢谢。

3 个答案:

答案 0 :(得分:4)

  

(char *)0是什么意思?

它将0转换为指针。虽然没有必要。您本可以使用

    char *p = 0;

    char *p = NULL;
  

(int)(p+1)的作用是什么?

p+1求值为指针值。 (int)部分将指针强制转换为int。它在某些平台上有效,因为pp+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之后放置另一个ppp+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)再次用于演员表。对于每种类型,它都会给出大小,因为它的值是第一个地址和第二个地址之间的距离。