18新利最新登入C语言编程原理

C编程语言比许多其他语言提供了更多的通用性,包括对计算机内存的更好控制。"width=
C编程语言比许多其他语言提供了更多的通用性,包括对计算机内存的更好控制。
iStockphoto /思想库

C编程语言非常流行,原因很容易理解。用C语言编程是高效的,并且给了程序员很大的控制权。许多其他编程语言,如c++, Java和Python都是使用C开发的。

如果你是一名程序员,你不可能只在工作中使用C语言,这种可能性每天都在增加。18新利最新登入然而,有几个学习C是非常有益的,即使你不经常使用它。原因如下:

广告

你将能够阅读和编写可以在许多不同类型的计算机平台上使用的软件代码,包括从小型微控制器到台式机,笔记本电脑和移动操作系统。

您将更好地理解高级语言在幕后做什么,比如内存管理和垃圾收集。这种理解可以帮助您编写更有效地工作的程序。

如果你是一名信息技术(IT18luck手机登录)专家,你也可以从学习c语言中受益。IT专业人员经常将编写、维护和运行脚本作为他们工作的一部分。一个脚本是计算机操作系统要遵循的指令列表。为了运行某些脚本,计算机设置了一个受控的执行环境,称为壳牌.由于大多数操作系统运行基于C的shell,C shell是IT专业人士使用的C语言的流行脚本改编。

本文介绍了C语言背后的历史,介绍了C语言为什么如此重要,展示了一些基本的C代码示例,并探讨了C语言的一些重要特性,包括数据类型、操作、函数、指针和内存18新利最新登入管理。虽然本文不是C编程的指导手册,但它确实涵盖了C编程的独特之处,这超出了一般C编程指南的前几章。

让我们先来看看C编程语言的起源,它是如何发展的,以及它在当今软件开发中的角色。18新利最新登入

广告

C是什么?

定义C语言最简单的方法是称其为计算机编程语言,这意味着您可以用它编写计算机可以执行的软件。其结果可能是一个大型计算机应用程序,比如Web浏览器,或者是嵌入微处理器或其他计算机组件中的一组微小指令。

C语言是20世纪70年代初在贝尔实验室开发的,主要归功于肯·汤普森和丹尼斯·里奇的工作。程序员需要一套对用户更友好的UNIX操作系统指令,这在当时需要用汇编语言编写程序。汇编程序直接与计算机硬件对话,调试过程漫长且困难,而且需要冗长、耗时的工作来添加新功能[来源:King]。

广告

Thompson对高级语言的第一次尝试被称为B语言,这是对其所基于的系统编程语言BCPL的致敬。当贝尔实验室收购数字设备公司(DEC)的UNIX系统模型PDP-11时,汤普森对B进行了重新设计,以更好地适应更新、更好的系统硬件的需求。于是,B的继任者C诞生了。到1973年,C已经足够稳定,UNIX本身可以使用这种创新的高级语言重写[来源:King]。

在C语言在贝尔实验室之外得到有效应用之前,其他程序员需要一份解释如何使用它的文档。18新利最新登入1978年,Brian Kernighan和Dennis Ritchie合著的《C编程语言》(被C爱好者称为K&R或“白皮书”)成为C编程的权威来源。在撰写本文时,最初于1988年出版的《K&R》第二版仍广为流传。基于那本书,C的原始标准版本被称为K&R C。

为了确保人们不会随着时间的推移而产生自己的方言,C语言开发人员在20世纪80年代一直致力于为该语言创建标准。C的美国标准,美国国家标准协会(ANSI)标准X3.159-1989,于1989年正式成为官方标准。国际标准化组织(ISO)的标准,ISO/IEC 9899:1990,随后于1990年。K&R之后的C版本参考了这些标准及其后续修订(C89, C90和C99)。你可能还会看到C89被称为“ANSI C”、“ANSI/ISO C”或“ISO C”。

C语言及其在UNIX中的应用只是20世纪80年代操作系统开发热潮的一部分。尽管C语言比以前的语言有了很大的改进,但它仍然不能轻松地用于开发大型软件应用程序。随着计算机变得越来越强大,对更简单的编程体验的需求也在增加。这种需求促使程序员使用c来构建他们自己的编译器,从而构建他们自己的新编程语言。这些新语言可以简化包含大量移动部件的复杂任务的编码。例如,像c++和Java这样的语言,都是从C语言发展而来的,它们简化了面向对象编程,一种优化程序员重用代码能力的编程方法。

现在您已经了解了一些背景知识,让我们来看看C本身的机制。

广告

编辑和编译C代码

C语言被称为编译语言,这意味着在运行代码之前,必须使用编译器将代码转换为可执行文件。代码被写入一个或多个文本文件,您可以在任何文本编辑器中打开、阅读和编辑这些文件,例如Windows中的Notepad、Mac中的TextEdit和Linux中的gedit。可执行文件是指计算机可以运行(执行)的文件。编译器检查代码是否有错误,如果没有错误,就创建一个可执行文件。

在查看C代码中包含了什么之前,让我们先确定能够找到并使用C编译器。如果你使用的是Mac OS X和大多数Linux发行版(比如Ubuntu),如果你安装了特定操作系统的开发工具软件,你可以在你的计算机上添加C编译器。这些免费的C编译器是命令行工具,这意味着您通常会在终端窗口的命令提示符下运行它们。运行这些C编译器的命令是“cc”或“gcc”加上一些命令行选项和参数,它们是在按Enter之前键入在命令后的其他单词。

广告

如果您正在使用Microsoft Windows,或者您更喜欢使用图形用户界面而不是命令行,则可以为C编程安装集成开发环境(IDE)。IDE是一个单独的接口,你可以在其中编写代码、编译、测试并快速发现和修复错误。对于Windows,您可以购买Microsoft Visual c++软件,这是一种C和c++编程的IDE。另一种流行的IDE是Eclipse,这是一种免费的基于java的IDE,可以在Windows、Mac和Linux上运行,并提供了用于编译C和许多其他编程语言的扩展。

对于C语言,就像其他计算机编程语言一样,你使用的编译器版本非常重要。您总是希望使用的C编译器版本与您在程序中使用的C语言版本一样新或更新。如果您正在使用IDE,请务必调整您的设置,以确保IDE对您正在处理的程序使用您的目标C版本。如果你在命令行中,你可以添加一个命令行参数来更改版本,如下所示:

GCC -std c99 -o myprogram.exe myprogram.c

在上面的命令中,“gcc”是运行编译器的调用,其他都是命令行选项或参数。在"-std"选项后面加上"c99",告诉编译器在编译过程中使用C的c99标准版本。“-o”选项后面跟着“myprogram.exe”,以请求可执行文件,即编译器的输出文件,命名为myprogram.exe。如果没有"-o",可执行文件将自动命名为a.o out。最后一个参数“myprogram.c”表示要编译的C代码的文本文件。简而言之,这个命令是在说:“嘿,gcc,使用C99 C编程标准编译myprogram.c,并将结果放在名为myprogram.exe的文件中。”在Web上浏览可以用于特定编译器(无论是gcc还是其他编译器)的完整选项列表。

安装了编译器之后,就可以用C编程了。让我们先看一下可以编写的最简单的C程序之一的基本结构。

广告

最简单的C程序

让我们看一个简单的C程序,并使用它来理解C的基础知识和C编译过程。如果您自己的计算机上安装了前面描述的C编译器,那么您可以创建一个名为sample.c的文本文件,并在我们逐步完成这个示例时使用它。请注意,如果您在文件名中省略了.c,或者如果您的编辑器将.txt附加到名称后,那么在编译它时可能会得到某种错误。

下面是我们的示例程序:

广告

/*示例程序*/

# include < stdio . h >

int main ()

printf("这是我的第一个程序的输出!\n");

返回0;

当编译和执行时,这个程序指示计算机输出一行“这是我的第一个程序的输出!”然后停止。没有比这更简单的了!现在让我们看看每一行都在做什么:

第1行——这是用C语言编写注释的一种方法,在一行或多行/*和*/之间。

第2行——#include命令告诉编译器查看现有C代码的其他源代码,特别是库,这些库是包含常见可重用指令的文件。引用一个标准C库,其中包含从用户获取输入和将输出写入屏幕的函数。我们稍后会更详细地介绍图书馆。

第3行——这一行是函数定义的第一行。每个C程序都至少有一个函数,或者一段代码,表示程序运行时计算机应该做的事情。函数执行它的任务,然后产生一个副产品,称为返回值,可以被其他函数使用。该程序至少有一个名为main的函数,就像这里显示的那样,它的返回值为数据类型int,这意味着整数。18新利最新登入当我们稍后进一步研究函数时,您将看到空括号的含义。

第4行和第7行——函数中的指令用大括号括起来。一些程序员在不同的行上开始和结束一个括号括起来的块,如下所示。18新利最新登入另一些则将开大括号({)放在函数定义的第一行的末尾。虽然程序中的代码行不必在单独的行上输入,但程序员通常会将每条指令放在单独的行上,用空格缩进,以使代码更容易阅读和编辑。

第5行——这是一个对printf函数的函数调用。该函数是在第1行包含的stdio.h库中编码的,因此您不必自己编写它。printf调用告诉它要打印到屏幕上的内容。不过,位于引号末尾的\n不会被打印出来;它是一个转义序列,指示printf将光标移动到屏幕上的下一行。另外,如您所见,函数中的每一行都必须以分号结束。

第6行——每个返回值的函数都必须包含这样的return语句。在C语言中,main函数必须总是有一个整数返回类型,即使它没有在程序中使用。请注意,在运行C程序时,实际上是在运行它的主函数。所以,当你测试程序时,你可以告诉计算机显示运行程序的返回值。18新利最新登入返回值为0是首选,因为程序员通常在测试中寻找该值以确认程序成功运行。

当您准备好测试程序时,保存文件并编译并运行程序。如果你在命令行中使用gcc编译器,并且程序在一个名为sample.c的文件中,你可以用下面的命令编译它:

GCC -o sample.exe sample

如果代码中没有错误,运行此命令后,您应该在与sample.c相同的目录中有一个名为sample.exe的文件。最常见的错误是语法错误,这意味着您键入了一些错误,例如在一行的末尾遗漏了分号,或者没有结束引号或括号。如果您需要进行更改,请在文本编辑器中打开该文件,修复它,保存更改并再次尝试compile命令。

要运行sample.exe程序,输入以下命令。注意./,它迫使计算机查看当前目录以查找可执行文件:

。/ sample.exe

以上是C语言编码和编译的基础知识,不过您可以从其他C编程资源中了解更多关于编译的知识。现在,让我们打开这个盒子,看看C语言中有哪些用于构建程序的部分。

广告

C语言常见编程概念

让我们看看如何在C代码中实践一些常见的编程18新利最新登入概念。以下是对这些概念的简要总结:

功能—如前所述,函数是一段代码,表示程序运行时计算机应该做的事情。有些语言称这些结构为方法,尽管C程序员通常不使用这个术语。您的程序可以定义几个函数,并从其他函数调用这些函数。稍后,我们将仔细研究C语言中的函数结构。

广告

变量—当你运行一个程序时,有时你需要在不知道值是什么的情况下灵活地运行程序。像其他编程语言一样,C允许您在需要灵活性时使用变量。就像代数中的变量一样,计算机编程中的变量是一个占位符,它代表一些您不知道或还没有找到的值。

数据类型为了在程序运行时将数据存储在内存中,并知道可以对这些数据执行哪些操作,C等编程语言定义了它可以识别的某些数据类型。C语言中的每种数据类型都有一定的大小,以二进制位或字节衡量,以及一组关于其位代表什么的规则。接下来,我们将看到在使用C时为任务选择正确18新利最新登入的数据类型是多么重要。

操作在C语言中,你可以对数字执行算术运算(比如加法),对字符串执行字符串运算(比如连接)。C也有内置的操作,专门为您可能想要对数据进行的操作而设计。当我们检查C中的数据类型时,我们也会简要地看一下操作。

循环程序员想要做的最基本的事情之一就是根据程序运行时出现的某些条件重复某个操作若干次。基于给定条件进行重复的代码块称为循环,C语言提供了这些常见的循环结构:while、do/while、for、continue/break和goto。C还包括常见的if/then/else条件和switch/case语句。

数据结构当你的程序有很多数据要处理,并且你需要对这些数据进行排序或搜索时,你可能会使用某种数据结构。数据结构是表示同一数据类型的多个数据的结构化方式。最常见的数据结构是数组,它只是一个给定大小的索引列表。C语言有一些库可用于处理一些常见的数据结构,不过您也可以编写函数并设置自己的结构。

预处理操作有时候,在将代码编译成可执行文件之前,你需要给编译器一些指令。这些操作包括替换常量值和包括来自C库的代码(您在前面的示例代码中看到了)。

C还要求程序员处理一些许多编程语言已经简化或自动化的概念。这包括指针、内存管理和垃圾收集。后面的章节将介绍在用C编程时需要了解的关于这些概念的重要事项。

如果您还不是程序员,那么这些概念的快速概述可能会让您感到难以承受。在继续学习密集的C编程指南之前,让我们以用户友好的方式了解上面列出的核心概念,从函数开始。

广告

C语言中的函数

大多数计算机编程语言允许您创建某种类型的函数。函数允许您将一个长程序分割为命名的部分,以便在整个程序中重用这些部分。一些语言的程序员,特别是那些使用面向对象编程技术的程序员,会使用这个术语方法而不是函数

函数接受参数并返回结果。组成函数的代码块是函数定义。函数定义的基本结构如下:

广告

<返回类型> <函数名>(<参数>)

<描述>

返回<适合返回类型>的值;

C程序至少有一个名为main的函数。编译器将寻找一个main函数作为程序的起点,即使main函数调用了它内部的其他函数。下面是我们在前面的简单C程序中看到的主要内容。它有一个返回类型为整数,不接受参数,并且有两个语句(函数中的指令),其中一个是它的返回语句:

int main ()

printf("这是我的第一个程序的输出!\n");

返回0;

main以外的函数有一个定义和一个或多个函数调用。函数调用是另一个函数中的语句或语句的一部分。函数调用的函数名后面加圆括号。如果函数有形参,则函数调用必须包含相应的值以匹配这些形参。函数调用的附加部分称为向函数传递参数。

但是什么是参数呢?函数的形参是函数工作所需的某种数据类型的数据。C中的函数可以接受无限数量的形参,有时称为实参。添加到函数定义中的每个形参必须指定两件事:它的数据类型和它在函数块中的变量名。多个参数之间用逗号分隔。在下面的函数中,有两个参数,都是整数:

int doubleAndAdd(int a, int b)

返回((2 *)+ (2 * b));

接下来,让我们继续研究函数,缩小范围,看看它们如何适用于更大的C程序。18新利最新登入

广告

函数原型

在C语言中,可以在程序的任何地方添加函数定义(在另一个函数中除外)。唯一的条件是你必须提前告诉编译器这个函数存在于代码后面的某个地方。您将在程序开始时使用函数原型来实现这一点。原型是一个看起来类似于定义的第一行的语句。在C语言中,你不需要在原型中给出参数的名称,只需要给出数据类型。下面是doubleAndAdd函数的函数原型:

int doubleAndAdd(int, int);

广告

把函数原型想象成程序的打包清单。编译器将解包并组装你的程序,就像你解包并组装一个新书架一样。装箱单可以帮助你在开始组装书架之前确保盒子里有你需要的所有部件。编译器在开始组装程序之前以同样的方式使用函数原型。

如果您正在使用我们前面看过的sample.c程序,请打开并编辑该文件,为这里显示的doubleAndAdd函数添加函数原型、函数定义和函数调用。18新利最新登入然后,像以前一样编译并运行程序,看看新代码是如何工作的。18新利最新登入你可以使用下面的代码作为指导来尝试它:

# include < stdio . h >

int doubleAndAdd(int, int);

int main ()

printf("这是我的第一个程序的输出!\n");

printf("If you double then add 2 and 3, result is: %d \n", doubleAndAdd(2,3));

返回0;

int doubleAndAdd(int a, int b)

返回((2 *)+ (2 * b));

到目前为止,我们已经了解了C程序中的一些基本结构元素。现在,让我们看看在C程序中可以处理的数据类型,以及可以对这些数据执行哪些操作。

广告

C语言中的数据类型和操作

从计算机的角度来看,您的程序只是一系列的1和0。C语言中的数据类型告诉计算机如何使用这些位。18新利最新登入"width=
从计算机的角度来看,您的程序只是一系列的1和0。C语言中的数据类型告诉计算机如何使用这些位。18新利最新登入
极盛时期/思想库

从计算机的角度来看,数据只是一系列表示硬盘驱动器或计算机处理器或内存中电子位的开和关状态的1和0。它是你在计算机上运行的软件,它决定如何理解这数十亿个二进制数字。18新利最新登入除了基于给定的数据类型解释数据之外,C是少数几种可以在位级上轻松操作数据的高级语言之一。

数据类型是一组小规则,指示如何理解一系列位。18新利最新登入数据类型具有特定的大小,以及对该类型的数据执行操作的方式(例如加法和乘法)。在C语言中,数据类型的大小与所使用的处理器有关。例如,在C99中,整型数据类型(int)的数据块在16位处理器中是16位,而在32位和64位处理器中是32位。

广告

C程序员需要知道的另一件重要的事情是该语言如何处理有符号和无符号数据类型。18新利最新登入有符号类型意味着它的一位被保留,作为它是正数还是负数的指示器。因此,16位系统上的unsigned int可以处理0到65,535之间的数字,而同一系统上的signed in可以处理-32,768到32,767之间的数字。如果一个操作导致int变量超出了它的范围,程序员必须用额外的代码处理溢出。

考虑到C数据类型和操作中的这些限制和系统特定特性,C程序员必须根据程序的需要选择数据类型。他们可以选择的一些数据类型是C语言中的基本数据类型,即C编程语言中内置的数据类型。请参阅您最喜欢的C编程指南,以获得C中数据类型的完整列表,以及关于如何将数据从一种类型转换为另一种类型的重要信息。18luck手机登录18新利最新登入

C程序员还可以创建数据结构,它结合了基本数据类型和一组定义如何组织和操作数据的函数。18新利最新登入虽然数据结构的使用是一个高级编程主题,超出了本文的范围,但我们将研究一种最常见的结构:数组。数组是一个虚拟列表,其中包含所有相同数据类型的数据块。数组的大小不能改变,但它的内容可以复制到其他更大或更小的数组。

虽然程序员经常使用数字数组,但被称为字符串的字符数组具有最独特的特性。字符串允许您将您可能说的话(如“hello”)保存为一系列字符,您的C程序可以从用户读取或打印到屏幕上。字符串操作有这样一组独特的操作,它有自己专用的C库(String .h),其中包含典型的字符串函数。

C中的内置操作是在大多数编程语言中可以找到的典型操作。当您将多个操作组合到一个语句中时,一定要知道操作符的优先级,或者程序在数学表达式中执行每个操作的顺序。例如,(2+5)*3等于21,而2+5*3等于17,因为C将在加法之前执行乘法,除非有括号另行说明。

如果您正在学习C语言,请优先熟悉其所有基本数据类型和操作,以及同一表达式中操作的优先级。此外,还可以尝试对变量和不同数据类型的数量进行不同的操作。

至此,您已经了解了一些重要的C基础知识。接下来,让我们看看C如何使您能够编写程序,而不必每次都从18新利最新登入头开始。

广告

不要从头开始,使用库

库在C语言中非常重要,因为C语言只支持它所需要的最基本的特性。例如,C语言不包含从键盘读取和写入屏幕的输入-输出(I/O)函数。任何超出基础的内容都必须由程序员编写。如果代码块对多个不同的程序有用,则通常将其放入库中,使其易于重用。

到目前为止,在C语言的讨论中,我们已经看到了一个标准I/O (stdio)库。程序开头的#include行指示C编译器从名为stdio.h的头文件加载库。C维护者包括用于I/O、数学函数、时间操作和特定数据结构(如字符串)的通用操作的标准C库。搜索Web或您喜爱的C编程指南,以获得有关C89标准库以及C99中的更新和添加的信息。18luck手机登录

广告

您也可以编写C库。通过这样做,您可以将程序分割为可重用的模块。这种模块化的方法不仅使在多个程序中包含相同的代码变得容易,而且还使程序文件更短,更容易阅读、测试和调试。

要在头文件中使用函数,请在程序的开头为它添加#include行。对于标准库,将库对应的头文件名称放在大于号和小于号之间()。对于您自己创建的库,将文件名放在双引号之间。与C程序中其他部分的语句不同,不必在每行末尾加分号。以下显示包括每种类型的库:18新利最新登入

# include < math.h >

# include“mylib.h”

一个全面的C编程源代码应该提供用C编写自己的库所需的说明。无论函数定义是在库中还是在主程序中,您将编写的函数定义都没有什么不同。不同之处在于,您将在称为对象文件(名称以.o结尾)的文件中分别编译它们,并且您将创建第二个文件,称为头文件(名称以.h结尾),其中包含与库中每个函数对应的函数原型。它是你在每个使用你的库的主程序的#include行中引用的头文件,并且在每次编译该程序时,你将把目标文件作为参数包含在编译器命令中。

到目前为止,我们探索的C特性在其他编程语言中也很典型。接下来,我们将讨论C语言如何管理计算机内存。18新利最新登入

广告

C语言中关于指针的一些指针

当你的C程序被加载到内存(通常是计算机中的随机存取存储器或RAM)时,程序的每一部分都与内存中的一个地址相关联。这包括用于保存某些数据的变量。每次程序调用一个函数时,它都会将该函数及其所有相关数据加载到内存中,以便运行该函数并返回一个值。如果将参数传递给函数,C会自动生成要在函数中使用的值的副本。

但是,有时当您运行一个函数时,您希望对原始内存位置上的数据进行一些永久性更改。如果C语言复制了要在函数中使用的数据,则原始数据保持不变。如果想要更改原始数据,必须传递一个指向其内存地址的指针(按引用传递),而不是将其值传递给函数(按值传递)。

广告

指针在C语言中无处不在,所以如果你想充分使用C语言,你必须很好地理解指针。指针和其他变量一样是一个变量,但它的目的是存储一些其他数据的内存地址。该指针还具有数据类型,因此它知道如何识别该内存地址上的位。18新利最新登入

当您在C代码中并排查看两个变量时,您可能并不总是能认出指针。即使对最有经验的C程序员来说,这也是一个挑战。但是,当您第一次创建指针时,这就更加明显了,因为在变量名之前必须有一个星号。这在c语言中被称为间接操作符。下面的示例代码创建一个整数i和一个指向整数p的指针:

int我;

int * p;

目前没有赋值给i或p。接下来,让我们给i赋一个值,然后赋p指向i的地址。

I = 3;

P = &i;

在这里,你可以看到&(&)被用作i之前的地址操作符,意思是“i的地址”。你不需要知道那个地址来做作业。这很好,因为每次运行程序时它都可能不同!相反,地址操作符将在程序运行时确定与该变量关联的地址。如果没有地址操作符,赋值操作p=i将为p分配3的内存地址,而不是变量i的内存地址。

接下来,让我们看看如何在C代码中使用指针18新利最新登入,以及需要准备的挑战。

广告

C语言中正确使用指针

如果您想精通C编程,您需要牢牢掌握如何在代码中有效地使用指针。18新利最新登入"width=
如果您想精通C编程,您需要牢牢掌握如何在代码中有效地使用指针。18新利最新登入
©iStockphoto.com/ DSGpro

一旦有了指针,就可以在操作和函数调用中使用它来代替相同数据类型的变量。在下面的例子中,在一个较大的操作中,使用指向i的指针而不是i。与p (*p)一起使用的星号表示该操作应该使用p指向该内存地址的值,而不是内存地址本身:

int b;

B = *p + 2;

如果没有指针,在C程序中几乎不可能将任务划分为main之外的函数。为了说明这一点,假设您在main中创建了一个名为h的变量,该变量将用户的身高存储到最近的厘米。您还可以调用自己编写的名为setHeight的函数来提示用户设置高度值。你的main函数中的行可能看起来像这样:

int h;

setHeight (h);这里有一个潜在的问题。* /

这个函数调用将尝试将h的值传递给setHeight。18新利最新登入然而,当函数结束运行时,h的值将保持不变,因为函数只使用了它的一个副本,然后在它结束运行时丢弃了它。

如果你想改变h本身,你应该首先确保函数可以接受一个指向现有值的指针,而不是一个新的值副本。然后,setHeight的第一行将使用指针而不是值作为参数(注意间接操作符):

setHeight(int *height){/*函数语句到这里*/}

然后,调用setHeight有两个选择。第一种是使用h的地址操作符作为传递的参数(&h)。另一种方法是创建一个单独的指向h的指针并传递它。下面显示了这两个选项:18新利最新登入

setHeight (h);/*将h的地址传递给函数*/

int * p;

P = &h;

setHeight (p);/*将指向h地址的单独指针传递给函数*/

第二个选项揭示了使用指针时的一个常见挑战。挑战在于有多个指针指向相同的值。这意味着一个值的任何变化都会同时影响它的所有指针。这可能是一件好事,也可能是一件坏事,这取决于您想在程序中实现什么。同样,掌握指针的使用是掌握C编程的重要关键。尽可能多地练习使用指针,这样你就能为面对这些挑战做好准备了。

到目前为止,我们探索的C特性在其他编程语言中也很典型。接下来,我们将讨论C语言对内存管理的要求。

C语言中内存管理的重要性

使C语言成为一种通用语言的原因之一是,程序员可以用非常少的内存来缩小程序的规模。当C语言刚开始编写时,这是一个重要的特性,因为那时的计算机远没有现在这么强大。随着当前对小型电子产品(从移动电话到微型医疗设备)的需求,人们对某些软件保持较小的内存需求重新产生了兴趣。对于大多数需要大量控制内存使用的程序员来说,C是首选语言。

为了更好地理解内存管理的重要性,请考虑程序如何使用内存。18新利最新登入当你第一次运行一个程序时,它会加载到计算机的内存中,并通过发送和接收来自计算机处理器的指令开始执行。当程序需要运行一个特定的函数时,它在运行期间将该函数加载到内存的另一部分,然后在函数完成时放弃该内存。另外,主程序中使用的每个新数据都在程序运行期间占用内存。

如果希望对所有这些进行更多控制,则需要动态存储分配。C语言支持动态存储分配,即在需要时预留内存,并在使用完内存后立即释放内存。许多编程语言都有自动内存分配和垃圾收集来处理这些内存管理任务。然而,C允许(在某些情况下要求)使用标准C库中的以下关键函数显式地分配内存:

  • malloc——内存分配的缩写,malloc用于保留给定大小的内存块,以描述程序需要处理的特定类型的数据。当您使用malloc时,您是在创建一个指向已分配内存的指针。对于单个数据来说,这不是必需的,比如一个整数,它在你第一次声明它的时候就被分配了(就像在int i中)。但是,它是创建和管理数据结构(比如数组)的重要部分。18新利最新登入C语言中可供选择的内存分配选项有calloc,当内存被保留时,它也会清除内存realloc,它会调整先前预留的内存的大小。
  • free——使用free强制程序释放先前分配给给定指针的内存。

使用malloc和free时的最佳实践是,你分配的任何东西都应该被释放。无论何时分配一些东西,即使是临时函数,它都会保留在内存中,直到操作系统清理空间为止。但是,为了确保内存是空闲的并且可以立即使用,应该在当前函数退出之前释放内存。这种内存管理意味着您可以将程序的内存占用保持在最低限度,并避免内存泄漏。内存泄漏是一种程序缺陷,它继续使用越来越多的内存,直到没有剩余的内存可供分配,导致程序停止或崩溃。另一方面,不要过于担心释放内存,这样会释放并丢失稍后在同一个函数中需要的某些东西。

通过本文,您已经学习了C编程语言的一些基本结构和核心概念。我们已经了解了它的历史,它与其他编程语言的共同特征,以及使它成为编码软件的独特和通用选项的重要特性。转到下一页获取更多信息,包括一些编程指南,这些指南将带您进一步了解C语言。18luck手机登录

常见问题解答

C编程和c++是一样的吗?
不。c++是C语言的扩展,并不是同一种语言。
C语言编程的概念是什么?
C语言编程是一个允许程序员创建可移植且高效的软件的概念。C编程是基于贝尔实验室在20世纪70年代开发的C语言。C编程是一种功能强大的通用语言,非常适合创建各种软件应用程序。

更多信息18luck手机登录

相关文章

更多优质链接

  • 布莱恩·W·克尼根和丹尼斯·M·里奇。C程序设计语言,第二版Prentice Hall, 1988年。
  • 国王,K.N.C语言编程:现代方法,第二版W.W.诺顿公司,2008。
特色

广告

加载……
Baidu