C中的指针转换代码的含义是什么

时间:2015-08-12 17:12:31

标签: c pointers casting

float number = 1.0;
float* number_pointer = &number;
int* int_pointer = (int*) number_pointer;                  
*int_pointer += 30;
printf("%f \n",number);

(*int_pointer)+= 30;行在这里做了什么?

2 个答案:

答案 0 :(得分:1)

我在那里看到两个问题。

  1. 使用

    时会发生什么
    int* int_pointer = (int*) number_pointer;
    

    该行获取包含float的对象的地址,并将该地址存储在int_pointer中。此时,编译器将能够将地址视为包含整数。这违反了strict aliasing rule

  2. 使用

    时会发生什么
    *int_pointer += 30;
    

    它会增加int_pointer指向30的对象的值。如果int_pointer指向有效的int对象,则该操作将没有问题。在您的情况下,这将导致未定义的行为,因为int_pointer确实指向float类型的对象。

答案 1 :(得分:0)

让我解释一下每个陈述:

float number = 1.0;

在这里,您声明并初始化了一个名为number的浮点变量。

float* number_pointer = &number;

声明并初始化浮点类型指针number_pointernumber。这意味着number_pointer包含变量number的地址,*number_pointer包含变量number的值,即1.0

int* int_pointer = (int*) number_pointer;

类型转换浮点指针number_pointer到整数指针并初始化为int_pointer。在此显式类型转换后,*int_pointer的值不是1.0,而是其对应的整数1065353216

*int_pointer += 30;

这是*int_pointer = *int_pointer + 30;的简写。 *int_pointer变为1065353246

printf("%f \n",number);

打印number的值,现在为1.000004而非初始1.000000。更改是由int_pointer上执行的添加引起的,该添加指向number_pointer指向的位置,而number指向变量drop table if exists temp_a; create temp table temp_a ( "QUERY PLAN" text ); DO $$ DECLARE rec record; BEGIN FOR rec IN EXECUTE 'EXPLAIN VERBOSE select version()' LOOP -- RAISE NOTICE 'rec=%', row_to_json(rec); insert into temp_a select rec."QUERY PLAN"; END LOOP; END $$ language plpgsql; select * from temp_a;