Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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语言中,低级别访问的含义是什么?_C - Fatal编程技术网

在c语言中,低级别访问的含义是什么?

在c语言中,低级别访问的含义是什么?,c,C,我刚开始用C语言编程,我被一句话困住了:C语言的主要功能包括对内存的低级别访问,任何人都可以解释这是什么意思 简单的答案是:C有指针 中等长度的答案是:您可以相对轻松/自由地访问内存槽指针 用一个例子给出一个较长的答案: int i = 42; // i is an integer (usually 4 bytes) int *p; // p is a pointer to an integer (it's not pointing to anything now) p = &i;

我刚开始用C语言编程,我被一句话困住了:C语言的主要功能包括对内存的低级别访问,任何人都可以解释这是什么意思

简单的答案是:C有指针

中等长度的答案是:您可以相对轻松/自由地访问内存槽指针

用一个例子给出一个较长的答案:

int i = 42; // i is an integer (usually 4 bytes)
int *p;  // p is a pointer to an integer (it's not pointing to anything now)
p = &i;  // make p point to the integer x, so now x and *p are "the same"
// and you can do crazy stuff like this
char *p1; // p1 is a pointer to an char (char is 1 byte)
p1 = ((char*)p) + 1; // now p1 points to the address one above p (i.e. the second byte of x)
*p1 = *p1 + 1; // this will effectively add 32 to x (if my in head math is correct)

这个例子很做作,你不应该做这样的事情。你不必担心不知道对内存的低级别访问意味着什么,试着学习C。最终,当你理解了C及其指针机制后,你可能会理解这本书对内存的低级别访问的含义。

计算机运行的机器代码是零和一。如果您在十六进制编辑器中打开一个程序,或者查看任何有关通信的硬件手册,您将看到[0-9A-F][0-9A-F]范围内的大量符号,这是base-16而不是base-2中的机器代码。用机器码写程序很难!将此视为地面0;你写的每一个字都将在计算机硬件上运行

机器代码是一系列指令;在大多数计算机上,如台式机或笔记本电脑上,这些字节是根据这些指令组合而成的。这些说明是用汇编代码编写的!这两个主题都是非常简短的介绍,如果您有兴趣,可以阅读更多关于它们的内容,但本质上它们允许直接访问寄存器和硬件。同样,每个步骤都是直接运行的,但它稍微抽象一些,因为它允许我们开始使用整个字母表!不过,它必须经过编译才能在处理器上运行

C不是汇编代码,它大部分是可读的人类形式。C基本上是一种较旧的语言,名为B,类型为system int、char等,B基本上是汇编的友好语法。这就是为什么您可以跳过许多C语句中的键入,而它的默认值是int

但是C没有做的是:

内存管理 面向对象编程 协同程序 高级类型功能 指针允许您直接修改内存,从本质上讲,您希望这样做的方式有好有坏。许多C方法编译成少量的汇编指令,尽管它提供了巨大的能力,但它需要比更高级的语言更多的工作——其中许多可能在汇编之前编译成C


把它想象成一个金字塔;沙漠是地面/机器代码,基础是汇编,它既硬又坚固,但需要大量的工作,而C位于它上面,仍然处于较低的级别,需要大量的工作,但它比做基础容易得多!将它们与Java和C进行比较,Java和C在更高的层次上高于Java和C,这应该可以回答这个问题。这是一个抽象的概念,实际上对语言来说意义不大。

在像C这样的低级语言中,程序员或多或少可以直接操作RAM。RAM是计算机上的一种设备,基本上包含地址处的字节,类似于邮箱和箱号。就像你们可以把邮件放在邮箱5里一样,你们也可以把15个放在地址2000里,或者类似的地方

低级别访问的一个常见示例是,您可能会告诉C在RAM中的某个地方创建一个新的整数,然后可以在该位置修改它,并在以后删除它


在您可能熟悉的其他语言中,这种管理是在幕后进行的,您可能永远不知道程序数据放在哪里,但在C语言中,您几乎可以完全控制程序。

发布代码以获得帮助。这意味着C语法允许您使用指针直接访问内存。通过这种方式,C语言允许您编写与系统机器代码非常接近的代码。因此它被称为低电平。它也意味着C不带后轮。这就把所有的责任都放在了程序员身上,以确保只使用有效访问的内存。如果您分配2个字节,那么没有任何东西可以阻止您尝试在该地址写入50个字节。在没有安全措施的情况下对内存的基本访问使C变得如此之快,但它也让程序员承担正确使用内存访问的所有责任。