天天看點

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

C/C++技術叢書 點選檢視第二章 點選檢視第三章 C指針原理揭秘:基于底層實作機制

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
劉 興 編著

第1章

C語言概述

C語言是一種通用的、過程式的程式設計語言,其廣泛應用于系統與應用軟體的開發,具有高效、靈活、功能豐富、表達力強和可移植性強等特點,是最近20多年使用最為廣泛的程式設計語言。C語言是由美國的丹尼斯·裡奇(Dennis M. Ritchie)于1969年至1973年以B語言為基礎在貝爾實驗室開發完成的。

1978年之後,C語言先後被移植到各種大、中、小型機及微型機上,它既可以作為工作系統設計語言編寫系統應用程式,也可以作為應用程式設計語言編寫不依賴計算機硬體的應用程式。目前,C語言的編譯器支援各種不同的作業系統,如UNIX、Windows、Linux等。C語言的設計也在很大程度上影響了後來的程式設計語言,例如C++、Objective-C、Java、C#等。

1.1 C語言的起源與發展

C語言的發展曆史頗為有趣,它的原型是ALGOL 60。1963年,劍橋大學将ALGOL 60發展成為CPL(Combined Programming Language);1967年,劍橋大學的Matin Richards 對CPL進行了簡化,于是産生了BCPL;1970年,美國貝爾實驗室的Ken Thompson對BCPL進行了修改,改名為B語言,同時用B語言編寫了第一個UNIX作業系統;1973年,美國貝爾實驗室的丹尼斯·裡奇在B語言的基礎上最終設計出了一種新的語言,他選取BCPL的第二個字母作為這種語言的名字,即C語言,丹尼斯·裡奇是以被世人稱為“C語言之父”。

為了推廣UNIX作業系統,1977年,丹尼斯·裡奇發表了《可移植的C語言編譯程式》,1978年,布萊恩·克尼漢(Brian W. Kernighian)和丹尼斯·裡奇出版了名著《The C Programming Language》,使C語言迅速成為世界上流行最廣的進階程式設計語言,K&R C也是以确定了其事實性标準的曆史地位。

随着微型計算機的日益普及,不同種C語言之間出現了不一緻的問題,這一點為C語言的廣泛應用帶來了不便。1989年,美國國家标準局(ANSI)頒布了第一個官方的C語言标準(X3.159-1989),簡稱ANSI C或C89;1990年,C89被國際标準化組織(ISO)采用為國際标準(ISO/IEC9899:1990),簡稱為C90,這是目前廣泛使用并完全支援的标準。

1999年,國際标準組織為C語言釋出了新的标準ISO/IEC 9899:1999,修正了C89标準中的一些細節,并增加了更多更廣的國際字元集支援,這個标準通常被稱為C99,ANSI于2000年3月采用C99。

2011年12月8日,ISO正式釋出了C語言的新标準C11,之前被稱為C1X,官方名稱為ISO/IEC 9899:2011,新的标準提高了對C++(1983年由貝爾實驗室的Bjarne Stroustrup推出,C++進一步擴充和完善了C語言,成為面向對象的程式設計語言)的相容性,并增加了很多新的特性。

1.2 C語言特性

2011年10月9日,丹尼斯·裡奇去世,享年70歲,Java之父詹姆斯·高斯林(James Gosling)為此發表了紀念C語言之父丹尼斯·裡奇的簡短博文:“丹尼斯·裡奇辭世的新聞如五雷轟頂,過去幾天已經有很多資訊在報道此事,他的影響巨大,并超越了科技世界,雖然他的巨大影響可能不為人知,但完全可以感受到的是,C語言撐起了一切。我的整個職業生涯也是從C語言和UNIX中發展而來的。”全世界的計算機愛好者都以他們特有的方式紀念這位程式設計語言的重要創始者,很多人在衆多的國際互動論壇中發帖悼念C語言之父,全帖僅僅隻用一個分号“;”(在C語言中,分号标志着一行指令語句的結束)形象地表達了人們的懷念之情。

C語言之父悄然離去,但C語言并沒有是以衰退,近年來它仍然是世界主流的程式設計語言之一。在2019年3月的TIOBE程式設計語言排行榜中(如圖1-1所示),C語言仍處于第2位,并呈現上升勢頭。

C語言主要有以下特性:

1)設計目标接近機器底層但不失跨平台性。C語言提供了許多低級處理的功能,可搭配彙編語言來使用,著名的C編譯器GCC(UNIX下常用的是CC)保持着良好的跨平台的特性,以一個标準規格寫出的C語言程式通過GCC(或CC)可在許多計算機平台上進行編譯,甚至包含嵌入式環境以及大型機平台。

2)C語言編譯生成的可執行檔案短小精悍。C語言能以簡易的方式進行編譯,可直接處理低級存儲器,僅産生少量的機器碼,并且不需要任何運作環境的支援便能運作。

3)C語言雖簡單但功能強大。C語言僅有32個保留字元,使用傳統的結構化設計,變量具有作用域、遞歸等優秀功能,編譯預處理使得編譯更具彈性,傳遞參數靈活,可采用值傳遞和指針傳遞兩種方式,不同的變量類型可用結構體(struct)組合在一起; 此外,C指針很容易就能對存儲器進行低級控制。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

1.3 開發環境搭建

下面以“helloworld”C程式(非GUI程式,運作在Windows的控制台和UNIX/Linux系統的終端)為例,講解Windows、類UNIX/Linux平台下的開發環境搭建(本書将以UNIX/Linux平台為主,對C指針及其應用進行講解)。

1.3.1 Windows開發環境

1. Microsoft Visual Studio

Microsoft Visual Studio(簡稱VS)是美國微軟公司的開發工具包系列産品。VS是一個基本完整的開發工具集,它包括了整個軟體生命周期中所需要的大部分工具,如UML工具、代碼管控工具、內建開發環境(IDE)等。所寫的目标代碼适用于微軟支援的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework、Microsoft Silverlight 及Windows Phone。

微軟公司提供了可供免費使用的Visual Studio Community 2015(其具備所有為Windows、iOS、Android裝置或是雲伺服器開發桌面、移動、網頁應用的全套功能)。讀者可通過Microsoft的網站下載下傳Visual Studio Community 2015(下載下傳位址為:

https://visuals-tudio.microsoft.com/zh-hans/vs/older-downloads/

),加載ISO映射檔案後再進行安裝。安裝完畢後再啟動Visual Studio Community 2015,選擇“Visual C++”項目中的“Win32控制台應用程式”(如圖1-2所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

單擊“确定”按鈕,出現向導對話框,選中“附加選項”區域的“空項目”之後,單擊“完成”按鈕(如圖1-3所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

由于剛才建立項目時選擇了“空項目”,是以需要增加C源代碼檔案,在源檔案處點選滑鼠右鍵,選擇“添加”→“建立項”(如圖1-4所示),輸入源代碼檔案名“main.c”(如圖1-5所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

在螢幕的左邊輸入“helloworld”的C語言代碼(如圖1-6所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

選擇“調試”菜單的“開始執行”(如圖1-7所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

程式經過編譯後,執行效果如圖1-8所示。

2. Code::Blocks

Code::Blocks 是一個開放源碼的、全功能的跨平台C/C++內建開發環境,它由C++語言開發完成,使用了著名的圖形界面庫wxWidgets。相比Visual Studio而言,Code::Blocks是跨越平台的C/C++IDE,支援Windows、Linux、Mac OS X平台,最重要的是它遵守GPL開源協定,Windows使用者可以使用它免費編譯Win應用程式以及跨平台的應用程式,而無須依賴于Visual Studio。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

Code::Blocks提供了許多工程模闆,包括控制台應用、DirectX應用、動态連結庫、FLTK應用、GLFW應用、Irrlicht工程、OGRE應用、OpenGL應用、QT應用、SDCC應用、SDL應用、SmartWin應用、靜态庫、Win32 GUI應用、wxWidgets應用、wxSmith工程等;它支援文法彩色醒目顯示,支援代碼自動補全,支援工程管理以及項目建構、調試;此外,它還支援插件、代碼分析器、編譯器的選擇,同時還擁有靈活而強大的配置功能。

Code::Blocks的下載下傳位址為

http://www.codeblocks.org/downloads

,Windows平台下建議下載下傳codeblocks-13.12mingw-setup.exe安裝檔案,因為該安裝檔案不僅包括Code::Blocks本身,還将含有開源免費的mingw編譯器。下載下傳安裝好Code::Blocks之後,啟動它,啟動過程中會顯示它的logo(如圖1-9所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

啟動Code::Blocks之後,選擇“New”→“Project”,建立項目(如圖1-10所示)。

在項目模闆中選擇“Console application”(控制台程式),如圖1-11所示。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

選擇C語言為開發語言,如圖1-12所示。

輸入項目名稱“helloworld”,同時選擇項目所在的目錄(如圖1-13所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

單擊“Finish”按鈕,完成項目建立(如圖1-14所示)。

展開左邊的項目樹狀圖(如圖1-15所示),項目模闆在“main.c”中自動産生了“helloworld”的源代碼。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

将源代碼中的“Hello world!”字元串更改為中文的“您好,世界!”(如圖1-16所示)。

最後,選擇“Build”菜單的“Build and run”選項,編譯後(如圖1-17和圖1-18所示),運作程式(如圖1-19所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

1.3.2 UNIX/Linux開發環境

目前,除了Windows系統,最流行的作業系統就是UNIX和Linux了,下面分别以這兩個系統的經典代表—FreeBSD(世界上最穩定的類UNIX系統,基于UNIX的衍生系統BSD)與Ubuntu(最好用的Linux系統之一)為例,講解C語言開發環境的部署。

1. Ubuntu 開發環境

Ubuntu基于Debian釋出版和GNOME桌面環境建立,是開源且免費的Linux系統,它分為桌面版和伺服器版,其目标在于為使用者提供一個最新的同時又相當穩定的、主要由自由軟體建構而成的作業系統。Ubuntu系統既可安裝在全新的電腦上,也可以與Windows作業系統并存,還可以安裝在虛拟機中。下面以VisualBox虛拟機中運作的Ubuntu伺服器版為例進行講解。

1)在VisualBox虛拟機中建立Ubuntu的虛拟電腦。建立虛拟電腦,将記憶體設定為512MB或以上(如圖1-20所示),建立4GB或4GB以上的虛拟硬碟(如圖1-21、圖1-22和圖1-23所示)。

2)下載下傳Ubuntu伺服器版。伺服器版針對伺服器應用對核心做了優化,同時,對虛拟機的資源要求更少,其運作速度相對于桌面版更快,是以應選擇伺服器版作為學習C語言以及C指針的平台。從官網連結(

http://www.ubuntu.org.cn/download/server

)下載下傳Ubuntu的伺服器版(12.04版)映像檔案(如圖1-24所示)。

3)安裝Ubuntu。首先,單擊“裝置”→“配置設定光驅”,選擇一個虛拟CD光牒,在打開的檔案菜單中選擇啟動CD光牒的映像檔案(從官網上下載下傳的伺服器12.04版ISO檔案);然後,啟動虛拟機,選擇“English”語言作為系統語言(如圖1-25所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

接着,選擇“Install Ubuntu Server”(如圖1-26所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

選擇English作為安裝語言(如圖1-27所示),選擇“United States”區域(如圖1-28所示),随後配置鍵盤選項(如圖1-29和圖1-30、圖1-31所示)。

按系統提示輸入hostname(主機名,可以輸入任意英文名字)後,再輸入安裝初始化時需要自動建立的使用者名和密碼(如圖1-32、圖1-33和圖1-34所示,筆者輸入的使用者名為myhaspl,系統登入需要輸入使用者名全稱、使用者名及使用者密碼)。輸入的使用者密碼需要驗證(如圖1-35所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

完成以上基本安裝配置之後,安裝程式提示是否加密主目錄(如圖1-36所示)。作為學習C語言的Linux平台無須加密,選擇NO,然後安裝程式顯示硬碟分區方案,連續按Enter鍵接受磁盤的預設分區(如圖1-37和圖1-38所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

在接下來的幾個選項中,按Enter鍵接受預設選項,當提示選擇預設安裝軟體時,勾選第一項(OpenSSH server)(如圖1-39所示),以便随後使用SSH用戶端進行登入。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

安裝完畢後,重新啟動,Ubuntu提示登入界面,系統安裝完畢。

4)配置虛拟機的網絡裝置,連接配接網際網路,虛拟電腦設定中将網卡1設定為橋接方式(如圖1-40所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

5)使用剛才安裝時建立的使用者名和密碼登入後,通過passwd指令設定root密碼(如圖1-41所示),然後通過ifconfig指令檢視虛拟機自動擷取的IP位址(圖1-42中inet addr處表明目前配置設定的IP為192.168.1.239)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

6)使用putty登入虛拟機,然後部署學習本書所需要的C語言開發環境。

首先,登入虛拟機(如圖1-43和圖1-44所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

然後,設定超級使用者root密碼,指令如下:

$ sudo passwd root

[sudo] password for myhaspl:

Enter new UNIX password:

Retype new UNIX password:

passwd: password updated successfully

接下來,安裝GCC編譯器與gdb調試器,指令如下:

$ sudo apt-get install gcc

$ sudo apt-get install make

$ sudo apt-get install gdb

2. FreeBSD開發環境

1)在虛拟機中安裝FreeBSD。首先,建立FreeBSD虛拟電腦(如圖1-45所示)。

2)指定虛拟電腦的光驅為FreeBSD安裝ISO檔案後,啟動虛拟電腦,出現如圖1-46所示的起始界面,選擇“Install”按鈕。

3)輸入主機名(如圖1-47所示)。

4)選擇安裝元件,在這裡選擇全部安裝,最後一項的src是源碼,可以不選擇(如圖1-48所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

5)進行硬碟分區(如圖1-49、圖1-50和圖1-51所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

6)安裝程式開始進行系統安裝(如圖1-52所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

7)安裝完畢後,進行最後的配置。

先設定root賬号的密碼,接下來會提示你是否要增加一個普通使用者,輸入普通使用者名及密碼,以便在安裝完成後作為SSH登入使用者使用。輸入完畢後,會出現如圖1-53所示的提示界面,鍵入“yes”以确認剛才輸入的資訊,系統提示是否還要增加一個使用者,輸入“no”。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

然後,選擇exit,系統将提示是否需要手動配置(如圖1-54所示),選擇“no”,然後選擇“Reboot”重新開機虛拟電腦(如圖1-55所示)。

8)重新啟動虛拟機後,安裝GCC。

系統重新啟動後會出現如圖1-56所示的界面。

使用root使用者名登入,然後輸入密碼。成功登入後,會有提示符#出現(如圖1-57所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

安裝GCC,先在#提示符下輸入“sysinstall”,依次選擇Configure(如圖1-58所示)→ “Packages”(如圖1-59所示)→“CD/DVD”(如圖1-60所示)→“All”如(如圖1-61所示)→“gcc-4.6.3”(如圖1-62所示)後,點選“OK”後選擇“Install”(如圖1-63所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

9)允許登入的使用者加入wheel組。

當伺服器需要進行一些日常系統管理者無法執行的進階維護時,往往就要用到 root 權限,而wheel組就是一個包含這些特殊權限的使用者池。登入使用者成為wheel組的成員後,可取得root權限進行一些特權的操作,隻需要修改/etc/group,即可将使用者加入該組,修改的方法為:将安裝過程中輸入的普通登入使用者添加到 wheel 組的末尾,将wheel行改成形如下面的内容:

wheel:*:0:root,myhaspl

FreeBSD下可使用ee、vi、nano三種編輯器之一修改/etc/group檔案。

ee編輯器界面如圖1-64所示,在螢幕上方有快捷鍵提示,編輯完後,按Esc + Enter鍵離開 ee,編輯指令如下:

#ee /etc/group

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

對Linux比較熟悉的讀者,可安裝nano編輯器,安裝指令如圖1-65所示,安裝完畢後,可通過下面的指令修改/etc/group 檔案:

#nano /etc/group

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

以nano編輯器為例,在wheel行的末尾加入使用者名myhaspl(如圖1-66所示),按Ctrl+x鍵,nano提示“檔案已修改,是否儲存”,選擇“Y”,直接回車确認。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

10)通過ifconfig指令檢視虛拟機配置設定的IP位址(如圖1-67所示),在inet處可以看到IP位址為192.168.1.10。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

11)打開前面介紹的putty用戶端登入FreeBSD,使用剛輸入的myhaspl登入後輸入su指令,更換使用者身份為root,指令如下所示:

% su

Password:

root@myhaspl:/home/myhaspl #

12)安裝glib。安裝過程如下:

#cd /usr/ports/devel/glib20

root@dp:/usr/ports/devel/glib20 # make install clean

===> License LGPL20 accepted by the user

===> Found saved configuration for glib-2.36.3

===> Fetching all distfiles required by glib-2.36.3 for building

===> Extracting for glib-2.36.3

=> SHA256 Checksum OK for gnome2/glib-2.36.3.tar.xz.

===> Patching for glib-2.36.3

===> glib-2.36.3 depends on package: libtool>=2.4 - found

===> Applying FreeBSD patches for glib-2.36.3

..........................

13)喜歡vim(類似于vi的文本編輯器,增加了很多新的特性,其被推崇為最好的類vi編輯器)編輯器的,可以安裝vim編輯器,安裝過程如下:

myhaspl@myhaspl:~ % su

root@myhaspl:/home/myhaspl # find / -name vim

/usr/ports/editors/vim

root@myhaspl:/home/myhaspl # cd /usr/ports/editors/vim

root@myhaspl:/usr/ports/editors/vim # make install clean

=> vim-7.3.tar.bz2 doesn't seem to exist in /usr/ports/distfiles/vim.

=> Attempting to fetch

http://artfiles.org/vim.org/unix/vim-7.3.tar.bz2

1.3.3 随書網盤的開發環境

FreeBSD和Ubuntu的安裝過程比較煩瑣,并且安裝後仍然需要配置C語言開發環境,讀者若有興趣可根據前面的介紹,自行搭建屬于自己的C語言開發環境。為友善Linux/UNIX基礎薄弱者,本書已經将Linux系統的C語言開發環境(包括Ubuntu作業系統)制作成虛拟機檔案my_ub.vdi(網盤位址:

https://dwz.cn/uo3gCxWK

,提取碼:457a),隻需在virtualbox虛拟機中裝載該檔案即可使用。裝載步驟具體如下。

1)建立虛拟電腦,可在此輸入my_ubuntu(如圖1-68所示,也可輸入其他名稱)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

2)選擇記憶體大小為512MB(圖1-69所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

3)選擇“使用已有的虛拟硬碟檔案”選項(如圖1-70所示)後,按右下角的“選擇虛拟硬碟”按鈕(檔案夾内包含向上箭頭的圖示),選擇随書網盤的my_ub.vdi。裝載成功後,界面如圖1-71所示。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

4)點選“建立”按鈕,完成C語言開發環境的裝載,此時,虛拟機中已經建立了一個虛拟電腦my_ubuntu(如圖1-72所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

5)在設定的“網絡”選項中,設定“連接配接方式”為“橋接網卡”(如圖1-73所示)。

某些電腦裝載虛拟檔案my_ub.vdi後,可能會出現找不到網卡的情況,在這種情況下,可使用如下指令删除規則檔案,讓Ubuntu重新查找網卡:

$su

#cd /etc/udev/rules.d

#mkdir~/mybak

#mv *~/mybak

#reboot

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

使用PuTTY等工具登入伺服器進行測試。

提示:PuTTY 是自由的跨平台 SSH 用戶端(SSH協定是目前比較可靠的遠端管理手段,可以有效防止資訊洩露問題),可同時在 Win32 和 UNIX 系統下模拟 xterm 終端。在Windows下可以使用PuTTY用戶端登入虛拟機中運作的Ubuntu伺服器,輸入指令,開發和編譯C程式等,PuTTY的下載下傳位址為:

http://www.chiark.greenend.org.uk/

~sgtatham/putty/download.html

虛拟檔案my_ub.vdi的普通使用者(通常使用這個使用者登入)為myhaspl,密碼為168,root使用者(該使用者為超級使用者,通常使用myhaspl登入後,再使用su指令轉到超級使用者root)的密碼為myhaspl,可通過下面的步驟登入伺服器進行測試。

1)在虛拟機中輸入ifconfig指令,檢視虛拟機通過DHCP協定自動擷取的IP位址。(如圖1-74,inet addr處表明目前配置設定的IP為192.168.1.8)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

2)使用PuTTY登入,在HostName處輸入虛拟機的IP位址(如圖1-75所示)。

3)當詢問是否将該主機的資訊加入緩沖時,可選擇“是”(如圖1-76所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

4)輸入登入的使用者名myhaspl及密碼168,登入成功後,傳回目前伺服器的硬碟和記憶體使用情況、IP位址等基本狀态(如圖1-77所示)。

5)當光标停留在$提示符之後,随意輸入一個Linux指令(比如ls,用于列出目錄中的檔案)檢測指令執行是否成功(如圖1-78所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

6)上述步驟若均運作正常,則說明虛拟機加載成功,如果此時不再操作,則請輸入 shutdown指令關閉虛拟機中的Ubuntu系統,指令如下所示:

myhaspl@myhaspl:~$ sudo shutdown -h now

myhaspl@myhaspl:~$

Broadcast message from myhaspl@myhaspl

(/dev/pts/0) at 22:21 ...           

The system is going down for halt NOW!

1.4 hello,world

本節将以經典的“hello,world”程式(是指在計算機螢幕上輸出字元串行“hello, world!”的計算機程式,其通常是學習程式設計語言的第一個示範程式)為例,講解如何在Ubuntu作業系統下編輯、編譯以及運作C程式。

1. 編輯C代碼

編輯在Ubuntu系統中運作的C語言代碼有以下兩種方式。

第一種,使用PuTTY等SSH用戶端登入伺服器後使用nano或vim編輯器編寫C源代碼。

nano編輯器簡單易用但編輯效率不高,其界面底部有快捷鍵提示(如1.3.2節中圖1-66所示),可通過Ctrl鍵來控制,比如Ctrl+O鍵表示儲存目前檔案,Ctrl+W鍵表示進入搜尋菜單等,如果要檢視完整的操作清單,按 Ctrl+G鍵可進入幫助螢幕。vim功能強大且編輯效率較高,當習慣了vim編輯器之後,你将會有一種愛不釋手的感覺,會發現它比Windows下的notepad++、codeblocks、VisualStudio更實用,不少軟體工程師在Windows下使用gVim編寫C程式。

vim擁有3種模式:第一種模式是插入模式,用于輸入文本;第二種模式是編輯模式,用于執行指令,也稱為正常模式;第三種模式是指令模式,執行格式為“冒号 指令”。

插入模式并不是預設模式,必須按下“i”來進入插入模式,在螢幕上輸入C代碼。按下Esc鍵将從插入模式轉到編輯模式,該模式用于移動和操縱文本,有時會以非常有趣的方式進行。在指令模式下執行儲存、查找/替換以及配置vim等功能。比如需要儲存編輯的文本,在正常模式下輸入“:”,進入指令模式後,輸入“:w 檔案名”。

使用vim編輯器編寫C程式hello.c(如圖1-79所示),程式完成在螢幕上輸出“hello,world!”行的功能,代碼如程式1-1所示。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

第二種,在Windows下使用notepad++編輯好C代碼之後,通過FileZilla 等SFTP用戶端上傳到Ubuntu伺服器。

首先,在Windows系統中打開notepad++,輸入程式的源代碼(如圖1-80所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

将圖1-80所示的代碼以hello.c檔案名儲存并退出。

然後,上傳C程式到Ubuntu伺服器中。打開FileZilla的站點管理器,輸入Ubuntu伺服器站點資訊(如圖1-81所示)。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

伺服器連接配接成功之後(如圖1-82所示),上部是連接配接資訊,方框内左部為Windows系統(即用戶端本機)磁盤目錄,方框内右部為Ubuntu系統(需要連接配接的伺服器)磁盤目錄。

帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

将剛才編寫的C程式源代碼檔案(所示圖1-83所示的方框内的左中部)用滑鼠拖動到Ubuntu伺服器的myhaspl使用者目錄(如圖1-83所示的方框内的右部)中。

檔案上傳完成後的界面如圖1-84所示。

2. 編譯C程式

通過“gcc -o 執行檔案名 源代碼檔案”的指令格式編譯“hello,world”程式:

myhaspl@myhaspl:~$ cd learn1

myhaspl@myhaspl:~/learn1$ gcc -o hello hello.c

也可以使用make程式進行編譯。編寫如下所示的makefile檔案:

hello:hello.c

gcc hello.c -o hello           

clean:

rm hello
           
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章
帶你讀《C指針原理揭秘:基于底層實作機制》之一:C語言概述第1章

執行make指令完成編譯:

myhaspl@myhaspl:~/learn1$ make

gcc hello.c -o hello

3. 運作C程式

直接輸入執行檔案名,運作程式:

myhaspl@myhaspl:~/learn1$ ./hello

hello,world!

1.5 小結

本章首先概述了C語言的起源、發展,C标準從最初的K&R C發展到C99,直到最新的C11,每次新标準的釋出都意味着向C語言注入了更實用、更強大的功能;接着,列舉了C語言的特點,相比較于其他程式設計語言而言,C語言最大的優勢就是操作簡單且功能強大;然後分别以Windows、Ubuntu、FreeBSD作業系統為例,細緻講解了C語言開發環境的搭建,同時對随書網盤所附的虛拟機開發環境進行了解說;最後,以helloworld為例,簡述了如何編輯、編譯和運作C程式。

繼續閱讀