为什么说C语言是直接对硬件操作的语言?

Python025

为什么说C语言是直接对硬件操作的语言?,第1张

首先,C语言不能够直接对硬件进行操作。从本质上来说,连汇编语言都不可以。只有机器语言能够直接操作硬件。

其次,C语言要操作硬件是必须经过一系列的编译转换。最终它会成为0101的机械码,这个时候它根本不是我们所能够理解的C语言了。

以GCC编译器为例,这个可以分为四步。

第一步是预处理,包括语法检查等工作。

gcc -P abc.c

第二步由源程序生产汇编语言代码。

gcc -S abc.c

会生成abc.s文件,这个文件里就是汇编代码。

第三步编译器生成目标代码,一个源文件生成一个目标代码。

gcc -c abc.c

会生成abc.o

第四步连接器从目标代码生成可执行文件。

gcc abc.o

最后,相对来说,C语言在高级语言当中是最贴近物理层面的语言。它也被称作高级语言里面的低级语言。因为它很多方面都非常贴近硬件。典型的就是指针,这是一种通过物理地址直接操作内存的变量。

1.指针变量p分配在栈上,而字符串"abcdefg"分配在文字常量区。

2.是的。指针也是编译器生成的数据类型,是个长整型。

3.内存地址分为5块,堆区,栈区,全局(静态)数据区(分为未初始化和初始化区),

文字常量区,代码区。存储在不同区域的数据释放时间不同,存储在堆区的数据必须由程序员负责释放,用free或者是delete。而栈区的由系统自动释放。全局和静态的生存期就是整个程序运行期。

4.首先,概念性错误,编译器并不执行程序,执行程序的是你的系统。编译器只是实现了高级语言向机器语言的转化而已。至于计算机的工作原理,这个概念也太泛了,有硬件层也有软件层。硬件层基本也就是80x86的汇编和内存管理,软件层也就是操作系统了,请问你想知道什么?

5.a是数组名,最重要的是a是一个指针常量,你该了解了吧,常量是不能参与指针运算的,所以a++是错的。关于calloc和malloc,释放内存方面没什么区别(这个是个人观点)。

关于指针变量没有初始化的问题。其实指针本身也是个长整行的变量,他存放的地址完全可以理解为4*8的整数,那么他的分配方式也跟普通的变量一样了。如果你是全局指针,那么编译器会把它自动初始化为00000000(十六进制),如果是局部指针,那么这个量就是未知的了,根据函数堆栈有不同的结果。null也就是内存被写成了00000000(十六进制).这个空不是说不存在,而是内存被写成了4*8=32位的全0.

首先说VHDL:它是描述电路的计算机工具,早期的CPLD等器件是基于与-或阵列的,更容易说明这点,VHDL是描述电路行为的,当下载到器件后,它就是具体的电路,这个电路全由与-或阵列组成。后期的FPGA也一样,只是它是基于查找表的。再说C语言:我们可以认为它是用于控制特定电路的工作。我们都知道可以C编程的控制器都有程序存储器,它里面就存放了C编译后的二进制代码。而VHDL里下载后根本就不需要这个存放程序的地方。