C 什么是*(int*)&;变量意味着什么?

C 什么是*(int*)&;变量意味着什么?,c,pointers,casting,C,Pointers,Casting,我正在生成动态大小的数组。我所展示的代码部分是以它的方式获取数组的值,并且它可以正常工作 问题是我不知道这是怎么回事。我不明白为什么演员和预演都有指针 如何正确地编写类似的代码 示例:*(双*)&j 我还注意到,*(int*)和column_sum[I]+1不会将1添加到结果中。我也不知道为什么 double val = 1000 * multiplier; double *column_sum = malloc(val * sizeof *column_sum); do

我正在生成动态大小的数组。我所展示的代码部分是以它的方式获取数组的值,并且它可以正常工作

问题是我不知道这是怎么回事。我不明白为什么演员和预演都有指针

如何正确地编写类似的代码

示例:
*(双*)&j

我还注意到,
*(int*)和column_sum[I]+1不会将1添加到结果中。我也不知道为什么

    double val = 1000 * multiplier;
    double *column_sum = malloc(val * sizeof *column_sum);
    double *p = malloc(val * val * sizeof *p);
    printf("Rows/Columns: %.0f", val);

    for (i = 0; i < val; i++){
        column_sum[i] = 0.0;
        for (j = 0; j < val; j++){
            int index = i * (int)val + j;
            p[index] = *(double*)&j; // here
            int offsetI = *(int*)&column_sum[i] + 1; // here
            int offsetJ = *(int*)&p[index] + 1; // here
            printf("%d->", offsetI);
            printf("%d,", offsetJ);
        }
        printf("\n");
    }
double val=1000*乘数;
double*column_sum=malloc(val*sizeof*column_sum);
double*p=malloc(val*val*sizeof*p);
printf(“行/列:%.0f”,val);
对于(i=0;i”,offsetI);
printf(“%d”,offsetJ);
}
printf(“\n”);
}
它做什么:

&var // get the pointer of the variable
(type*)&var // cast the pointer to an other pointer type
*(type*)&var // Dereferencing the casted pointer so "interpret" the variable as a "type"
这里重要的是,它是
解释
,而不是
转换

我们可以在这个例子中看到不同之处:

float a = 0.5;
int b = (int)a;
int c = *(int*)&a;

printf("%f %08x %08x\n", a, b, c);

// Output:
// 0.500000 00000000 3f000000
// 3f000000 is the way 0.5 is encoding following standard IEEE 754
如果您想处理浮点数的表示,这是非常有用的,例如:

float a = 1.5;
int b = *(int*)&a;
b &= 0xF;
a = *(float*)&b;

例如,这里使用这种语法的原因是:,用于处理double的表示。

也许这是一个愚蠢的问题,但你是如何实现编码一些你不懂的东西的?哈哈,可能有很多空闲时间和谷歌搜索?我不记得为什么你没有包括你的索引变量(
i
,和
j
)的声明,而其中一个变量与你的问题直接相关。无论如何,除非
sizeof(j)
至少是
sizeof(double)
并且正确地符合您平台上浮点对齐的要求,否则该代码上写满了“这是一个不可执行的示例”。(老实说,即使那些条件是真的,那句话仍然是真的。)我怀疑是这样的(关于索引变量是
int
)。这段代码很容易就和我之前的评论描述的一样可怕,如果不是更可怕的话。代码实质上是说“取这个变量的地址,它不是一个
双精度
,并让它假设别名是指向-
双精度
,然后取消引用并提取值。”(如果
double
的大小与
int
的大小不一样,那么在任何平台上都是不起作用的,即使是这样,也会有对齐问题的风险,因为浮点往往会非常挑剔)。这些评论让我想起Kernighan的名言:“每个人都知道调试的难度是编写程序的两倍。因此,如果您在编写程序时尽可能聪明,您将如何调试它?”我还没有提到,但您的第三条评论应该是“取消引用指针”“这是一个演员阵容。我知道你想说什么,但表达得不太好。谢谢,我试着把它做得更清楚。我使用“解释”word强调了这样一个事实,即强制转换指针和强制转换值是不同的。很酷,我会记住这一点。我在C语言方面的经验很少,所以任何技巧都值得赞赏。注意:这个答案没有提到,除了少数例外,通过取消引用无效类型的指针来进行类型双关破坏了严格的别名规则,从而导致取消定义简而言之,代码不是符合标准的C语言,因此应该不惜一切代价避免。