C 与引用变量类型不同的指针

C 与引用变量类型不同的指针,c,pointers,types,C,Pointers,Types,我目前正在学习如何用C语言编程。今天我从指针开始,遇到了以下情况。当我编译程序时 #include<stdio.h> int main() { int a; double * p; p = &a; *p = 12.34; printf("%d\n",a); * (int *) p = 12.34; printf("%d\n",a); return 0; } 执行后,我得到输出 2061584302 Spe

我目前正在学习如何用C语言编程。今天我从指针开始,遇到了以下情况。当我编译程序时

#include<stdio.h>

int main() {

    int a;
    double * p;
    p = &a;
    *p = 12.34;
    printf("%d\n",a);
    * (int *) p = 12.34;
    printf("%d\n",a);

    return 0;
}
执行后,我得到输出

2061584302
Speicherzugriffsfehler (Speicherabzug geschrieben)
错误消息是德语,类似于

memory access error (core dumped)
但是,如果我注释掉这行
*p=12.34错误消失,输出为

0
12
代码的目的是演示指针类型与其引用的变量不同的问题。根据我正在学习的C++教材,输出应该是

2061584302
12

p=&a实际上是未定义的

< C和C++都不允许你重新解释<代码>和A<代码>(这是一个指向<代码> int >代码>的指针),作为一个指向<代码>双的指针。< /P>
(int*)p
也有类似的问题,尽管到那时损害已经造成


您可以强制转换到
void*
,并从
void*
返回到原始类型:现在,将这些视为您可以将指针类型强制转换为其他类型的唯一情况。

的行为
p=&a实际上是未定义的

< C和C++都不允许你重新解释<代码>和A<代码>(这是一个指向<代码> int >代码>的指针),作为一个指向<代码>双的指针。< /P>
(int*)p
也有类似的问题,尽管到那时损害已经造成

您可以强制转换到
void*
,并从
void*
返回到原始类型:现在,将这些视为您可以将指针类型强制转换为其他类型的唯一情况。

代码解释:(根据您的教科书)

#包括
int main(){
int a;//大小(2字节或4字节)
double*p;//它将指向8字节的连续内存
p=&a;//正因为如此,从a的第一个字节开始,它将删除8个字节(但根据C标准,未定义的行为)
*p=12.34;//分配给这8个字节
printf(“%d\n”,a);//该值在*p赋值中的第一个(2或4)字节,因为它从
*(int*)p=12.34;//现在您键入casted它以解除2个字节的引用,因此将12作为int存储在这些(2或4)字节中
printf(“%d\n”,a);//在*p赋值中该值的第一个(2或4)字节
返回0;
}
如果你需要更多的解释,请评论并询问我。谢谢。

用代码解释:(根据您的课本)

#包括
int main(){
int a;//大小(2字节或4字节)
double*p;//它将指向8字节的连续内存
p=&a;//正因为如此,从a的第一个字节开始,它将删除8个字节(但根据C标准,未定义的行为)
*p=12.34;//分配给这8个字节
printf(“%d\n”,a);//该值在*p赋值中的第一个(2或4)字节,因为它从
*(int*)p=12.34;//现在您键入casted它以解除2个字节的引用,因此将12作为int存储在这些(2或4)字节中
printf(“%d\n”,a);//在*p赋值中该值的第一个(2或4)字节
返回0;
}


如果你需要更多的解释,请评论并询问我。谢谢。

我会得到一本新教科书,看起来它告诉你包括C标题,并规定未定义行为的输出。实际上是C,不是C++,我在@乔治编程。对不起,我弄错了。不管怎样,我都会看看这本书的年代和有效期,也许它在骗你,然后会转到关于的一节,但如果不是,那么/您应该设置编译器的警告级别。对于这个代码,它应该对你大声喊叫。编译器警告你。我会得到一本新教科书,看起来它告诉你包括C标题和命令未定义行为的输出。实际上是C,不是C++,我在@乔治编程。对不起,我弄错了。不管怎样,我都会看看这本书的年代和有效期,也许它在骗你,然后会转到关于的一节,但如果不是,那么/您应该设置编译器的警告级别。对于这段代码,它应该向您发出警告。编译器警告您。因此,因为我们将
p
定义为
double*
指针,
p=&a
是未定义的?绝对是。如果你这样写,编译器保留吃掉你的猫的权利。(最可能发生的情况是,*p在
a
之后破坏内存,这是您的指针
p
。a
double
在您的系统上可能比
int
更大)。实际上,我可以通过使用float而不是double来避免错误。但是再一次,教科书没有假设double的大小与int的大小相同。因此,可以说,这本书仍然在说谎。如果这本书暗示如果两种类型的大小相同,那么它的唯一用途就是在冬天点燃。因此,因为我们将
p
定义为
double*
指针,
p=&a
未定义?绝对没有。如果你这样写,编译器保留吃掉你的猫的权利。(最可能发生的情况是,*p在
a
之后破坏内存,这是您的指针
p
。a
double
在您的系统上可能比
int
更大)。实际上,我可以通过使用float而不是double来避免错误。但话说回来,教科书并没有假设double的大小与int的大小相同。所以可以说,这本书仍然是谎言。如果这本书暗示如果两种类型的大小相同,那么它的唯一用途就是在冬天点燃。它是;)但这并不是因为我不喜欢你,我只是不认为这个解释解释解释了op的输出,他们的问题是什么。我将撤销dv,因为尽管我怀疑这会对op有所帮助,但它可能会帮助其他人:)请让我帮忙!因为我喜欢帮助初学者毕竟我当了这么长时间的老师,所以我喜欢帮助,就是这样@George@Corey让我说得更具体一点好吗?我哪里出了问题,你能告诉我吗
2061584302
12
#include<stdio.h>

int main() {

    int a;  // size let say (2 byte or 4 )
    double * p; // it will point to continous memory of 8 byte
    p = &a;     // Now because of this ,starting from first byte of a it will derefer 8 bytes (but Undefined behaviour acc to C standards)
    *p = 12.34;  // assigned to those 8 bytes
    printf("%d\n",a);  // first (2 or 4 ) bytes of that value in *p assignment as it starts from a
    * (int *) p = 12.34; // now you type casted it to derefer 2 bytes so store 12 in those (2 or 4) bytes as int
    printf("%d\n",a); // first (2 or 4) bytes of that value in *p assignment

    return 0;
}