Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的Void指针_C_Pointers_Char_Int_Void Pointers - Fatal编程技术网

C语言中的Void指针

C语言中的Void指针,c,pointers,char,int,void-pointers,C,Pointers,Char,Int,Void Pointers,我是C编程的初学者,现在正在学习指针的概念。这是我的代码->> `#include<stdio.h> int main() { char t='s'; int a=10; float s=89; void *ptr; ptr =&s; printf("%c\t",*((char*)ptr)); printf("%d\t",*((int*)ptr)); printf("%f\t",*((float*)pt

我是C编程的初学者,现在正在学习指针的概念。这是我的代码->>

`#include<stdio.h>
 int main()
 {  
    char t='s';
    int a=10;
    float s=89;
    void *ptr;

    ptr =&s;
    printf("%c\t",*((char*)ptr));
    printf("%d\t",*((int*)ptr));
    printf("%f\t",*((float*)ptr));
    return 0;
  }`

我的问题是,当我将一个指向浮点数的空指针延迟到Char中时,为什么输出是空白,而对于整数,它是1118961664。我想知道字节级别上发生了什么,这取决于字节和体系结构的对齐

float类型的浮点数占用4个字节。在这个表达式*char*ptr中,s的第一个字节被解释为一个字符。在表达式*int*ptr中,如果sizeof int等于4,则s的所有四个字节都被解释为整数


由于float和int的内部表示不同,因此会得到不同的vresults。

float类型的float数字占用4个字节。在这个表达式*char*ptr中,s的第一个字节被解释为一个字符。在表达式*int*ptr中,如果sizeof int等于4,则s的所有四个字节都被解释为整数

由于float和int的内部表示不同,因此会得到不同的vresults。

通常,float s变量的长度为4字节,其值89以IEEE 754格式表示。为了简单起见,让我们假设一下

第一个printf char将使用原始浮点变量s的第一个字节,因为一个C char=1字节。这里,第一个字节表示位于浮点s的4个字节中最低内存位置的字节。是的,这取决于机器的字节对齐方式。输出很可能为空,因为第一个字节对应于ascii控制字符,例如0

第二个printf(假设计算机/编译器中的int为4字节长)将采用与第三个printf相同的4字节,但将以整数形式打印。请注意整数和IEEE 754浮点数之间的差异。结果表明,89的IEEE 754表示对应于1118961664整数。这还取决于字节对齐方式

第三个printf做的是正确的,它将使用存储s的值89的字节,并将它们解释为浮点数。它应该打印89.0。这不取决于字节对齐方式

如果浮点数的大小或表示形式不同,则详细信息将更改多少字节来自何处,以及第二个printf打印的数字,但行为将类似。还请注意,原则上前两个printf调用具有未定义的行为。

通常,float s变量的长度为4字节,其值89以IEEE 754格式表示。为了简单起见,让我们假设一下

第一个printf char将使用原始浮点变量s的第一个字节,因为一个C char=1字节。这里,第一个字节表示位于浮点s的4个字节中最低内存位置的字节。是的,这取决于机器的字节对齐方式。输出很可能为空,因为第一个字节对应于ascii控制字符,例如0

第二个printf(假设计算机/编译器中的int为4字节长)将采用与第三个printf相同的4字节,但将以整数形式打印。请注意整数和IEEE 754浮点数之间的差异。结果表明,89的IEEE 754表示对应于1118961664整数。这还取决于字节对齐方式

第三个printf做的是正确的,它将使用存储s的值89的字节,并将它们解释为浮点数。它应该打印89.0。这不取决于字节对齐方式


如果浮点数的大小或表示形式不同,则详细信息将更改多少字节来自何处,以及第二个printf打印的数字,但行为将类似。还请注意,原则上前两个printf调用具有未定义的行为。

我想知道字节级别发生了什么。正在发生的事情被称为未定义行为,你不能从这件事开始学习。@n.m.赞成,尽管我确实认为想知道事情是如何实现的可能是自然和积极的。@BenjaminGruenbaum是的,这是自然的。这并不意味着这是正确的做法。对不起,你不从这件事开始学习是什么意思。事实上,我并没有直接从未定义的行为开始学习。我知道什么是空指针,什么是正确的方法来尊重它,但我很好奇,到底什么是这种未定义的行为!!以及为什么我的代码会导致未定义的行为。我很高兴fedemp完全回答了我的问题@n、 m.这种未定义的行为到底是什么。我建议使用网络搜索来搜索这个。为什么我的代码会导致未定义的行为。您可以将对象指针强制转换为void*,然后仅返回原始类型。把它转换成另一种类型,你的程序就会有UB。我想知道字节级别上发生了什么。正在发生的事情被称为未定义的行为

你不要从这件事开始学习。@n.m.赞成,尽管我确实认为想知道事情是如何实现的可能是自然和积极的。@BenjaminGruenbaum是的,这是自然的。这并不意味着这是正确的做法。对不起,你不从这件事开始学习是什么意思。事实上,我并没有直接从未定义的行为开始学习。我知道什么是空指针,什么是正确的方法来尊重它,但我很好奇,到底什么是这种未定义的行为!!以及为什么我的代码会导致未定义的行为。我很高兴fedemp完全回答了我的问题@n、 m.这种未定义的行为到底是什么。我建议使用网络搜索来搜索这个。为什么我的代码会导致未定义的行为。您可以将对象指针强制转换为void*,然后仅返回原始类型。将它转换为另一种类型,您的程序就有了UB.@Chrono Kitsune当我提到float时,我指的是float类型的对象。您正在使用类型为double的常量。double和float有不同的大小。@vladfrommosco您能告诉我规范中哪里说float是4字节吗?@ChronoKitsune 2.0不是doublefloat@BenjaminGruenbaum AFAIK浮点类型与IEC 60559单一格式匹配,如果我没有弄错的话,它适合4字节。@Benjamin提出的问题背后的要点是事实上,ISO C不需要特定的浮点格式。它鼓励使用附录F中的IEC 60559,说明符合该标准的实施可定义uu STDC_uIEC_u559_uuu。实现不需要定义该宏,无论它们是否符合附录F中的规范,但它将仅由符合的实现定义。换句话说,不能保证IEC 60559被使用。值与平台上的数字匹配可能是完全巧合。@Chrono Kitsune当我说浮点数时,我指的是浮点数类型的对象。您正在使用类型为double的常量。double和float有不同的大小。@vladfrommosco您能告诉我规范中哪里说float是4字节吗?@ChronoKitsune 2.0不是doublefloat@BenjaminGruenbaum AFAIK浮点类型与IEC 60559单一格式匹配,如果我没有弄错的话,它适合4字节。@Benjamin提出的问题背后的要点是事实上,ISO C不需要特定的浮点格式。它鼓励使用附录F中的IEC 60559,说明符合该标准的实施可定义uu STDC_uIEC_u559_uuu。实现不需要定义该宏,无论它们是否符合附录F中的规范,但它将仅由符合的实现定义。换句话说,不能保证IEC 60559被使用。在该平台上,这些值与该数字匹配可能完全是巧合。啊哈,关于浮点s的大小和表示,应该说在大多数系统上,或者说最有可能。事实证明,IEEE 764是在C标准的可选附录中指定的。有关详细信息,请参阅。很想知道是否有编译器对单精度浮点变量使用不同的表示法。啊哈,关于浮点的大小和表示法,应该是在大多数系统上,或者很可能是这样。事实证明,IEEE 764是在C标准的可选附录中指定的。有关详细信息,请参阅。想知道是否有编译器对单精度浮点变量使用不同的表示形式。