【发布时间】: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
这是源代码:
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
j 已经是一个 int 指针,所以强制转换是多余的。两条语句都会给k赋值相同的值(即变量i的地址)
【讨论】:
k=(int)j; 而不是k=(int*)j; 会怎样
k 是一个指针,你不应该给它分配整数。它有效,但你不应该这样做。
j 显式转换为(int) 对编译器来说不是问题。
在这种情况下没有。
j 已经是一个整型指针,所以不需要强制转换它。 (int*) 是多余的。
但如果指针类型与声明不匹配,则可能需要有人将其显式转换为适当的指针类型。
【讨论】:
j 是一个指向整型变量的指针,将其转换为int 用处不大。再次将其存储为指针会将其转换回指针类型,因此特别没有用k=(int)j,编译器可能会显示警告。
sizeof(int) = 4 执行 k=(int)j 将丢失 j 的信息。
sizeof(int) = 4 和 sizeof(int*) = 8,所以如果你将 int* 存储在 int 中,将会丢失 4 个字节。
在第二个赋值中,您对k 的类型进行了显式转换,这恰好与j 的类型相同。
如果它们的类型不同但类型可以转换,那么第二个赋值应该仍然有效,而第一个会产生错误。
【讨论】:
如果数据类型相似,则无需转换:
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;
}
【讨论】:
void *s; float *b; b = s; printf("%f",*b); 将起作用。它应该是在取消引用 void 指针时需要 Castin,就像在这种情况下必须使用 void *s; float b; b = *(float*)s; printf("%f",b); 强制转换,而不是在第一个。