【问题标题】:what is the difference between the two below assignments?以下两个作业有什么区别?
【发布时间】:2014-02-03 14:38:52
【问题描述】:

这是源代码:

int main(void)
{
    int i = 5, *j, *k;
    j = &i;
    k = j;        // first assignment
    k = (int*)j;  // second assignment
    return 0;
}

变量k的两次赋值有什么区别?

【问题讨论】:

    标签: c output variable-assignment


    【解决方案1】:

    j 已经是一个 int 指针,所以强制转换是多余的。两条语句都会给k赋值相同的值(即变量i的地址)

    【讨论】:

    • 如果我使用k=(int)j; 而不是k=(int*)j; 会怎样
    • @Vladp 不完全是编译错误。它应该是类型转换指针指向整数的警告。
    • 是的,很抱歉,这取决于编译器,但无论如何它不会超过警告。
    • 因为k 是一个指针,你不应该给它分配整数。它有效,但你不应该这样做。
    • @Dayalrai 实际上编译器会抱怨试图将整数分配给指针。将j 显式转换为(int) 对编译器来说不是问题。
    【解决方案2】:

    在这种情况下没有。

    j 已经是一个整型指针,所以不需要强制转换它。 (int*) 是多余的。

    但如果指针类型与声明不匹配,则可能需要有人将其显式转换为适当的指针类型。

    【讨论】:

    • 如果我做 k=(int)j;而不是 k=(int*)j;
    • j 是一个指向整型变量的指针,将其转换为int 用处不大。再次将其存储为指针会将其转换回指针类型,因此特别没有用k=(int)j,编译器可能会显示警告。
    • @learner:在 64 位机器上,sizeof(int) = 4 执行 k=(int)j 将丢失 j 的信息。
    • @learner 在 64 位机器中,sizeof(int) = 4sizeof(int*) = 8,所以如果你将 int* 存储在 int 中,将会丢失 4 个字节。
    【解决方案3】:

    在第二个赋值中,您对k 的类型进行了显式转换,这恰好与j 的类型相同。 如果它们的类型不同但类型可以转换,那么第二个赋值应该仍然有效,而第一个会产生错误。

    【讨论】:

    • 什么是隐式转换?没有这样的事。强制转换使用强制转换运算符,因此如果您愿意,它是显式的。其他一切都只是转换
    • 你说得对,我将隐式与显式混合,将修复。关键是您不需要在所有情况下都使用强制转换运算符,因此对程序员来说强制转换是隐藏的。
    【解决方案4】:

    如果数据类型相似,则无需转换:

    k and j 是整数指针 这里在将j 地址的k = (int*)j 赋值给k 时不需要显式类型转换。这里铸造是多余的。

    int main(void)
    {
        int i = 5, *j, *k;
        j = &i;
        k = j;        // first assignment
        k = (int*)j;  // second assignment
        return 0;
    }
    

    【讨论】:

    • -1 。在您的示例中,void *s; float *b; b = s; printf("%f",*b); 将起作用。它应该是在取消引用 void 指针时需要 Castin,就像在这种情况下必须使用 void *s; float b; b = *(float*)s; printf("%f",b); 强制转换,而不是在第一个。
    猜你喜欢
    • 2014-03-17
    • 2019-05-17
    • 2019-01-12
    • 2018-08-20
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2016-02-14
    相关资源
    最近更新 更多