C語言的函數庫是多組經過驗證的常用函數的集合,編寫C語言程式時使用庫函數,既可以提高程式運行效率,又可以提高編程品質,使用方法如#include
1. 左值與右值: C++對於左值和右值沒有標準定義,但是有一個被廣泛認同的說法:可以取地址的,有名字的,非臨時的就是左值;不能取地址的,沒有名字的,臨時的就是右值. 可見立即數,函數返回的值等都是右值;而非匿名對象(包括變數),函數返回的引用,const對象等都是左值.
前言定義沒有初始化式的變數時,系統有時候會幫我們初始設定變數。系統如何初始化取決於變數的類型以及變數定義的位置。 內建類型變數是否自動初始化取決於變數定義的位置。函數體外定義的變數初始成0;函數體內定義的變數不進行自動初始化。除了用作賦值操作的左運算元,其他任何使用未初始設定變數的行為都是未定義的,不要依賴未定義行為。以int類型為例,一段簡單的測試代碼:#include <iostream>using namespace std;int a;int main(){ int b;
選擇排序是排序演算法的一種,這裡以從小到大排序為例進行講解。基本思想及舉例說明選擇排序(從小到大)的基本思想是,首先,選出最小的數,放在第一個位置;然後,選出第二小的數,放在第二個位置;以此類推,直到所有的數從小到大排序。在實現上,我們通常是先確定第i小的數所在的位置,然後,將其與第i個數進行交換。下面,以對 3 2 4 1 進行選擇排序說明排序過程,使用min_index 記錄當前最小的數所在的位置。第1輪 排序過程
fscanf() 和 fprintf() 函數與前面使用的 scanf() 和 printf() 功能相似,都是格式化讀寫函數,兩者的區別在於 fscanf() 和 fprintf() 的讀寫對象不是鍵盤和顯示器,而是磁碟檔案。這兩個函數的原型為:int fscanf ( FILE *fp, char * format, ... );int fprintf ( FILE *fp, char * format, ... );fp 為檔案指標,format 為格式控制字元串,...
fgets() 有局限性,每次最多隻能從檔案中讀取一行內容,因為 fgets 遇到分行符號就結束讀取。如果希望讀取多行內容,需要使用 fread 函數;相應地寫入函數為 fwrite。fread() 函數用來從指定檔案中讀取塊資料。所謂塊資料,也就是若干個位元組的資料,可以是一個字元,可以是一個字串,可以是多行資料,並沒有什麼限制。fread() 的原型為:size_t fread ( void *ptr, size_t size, size_t count, FILE *fp
fgetc() 和 fputc() 函數每次只能讀寫一個字元,速度較慢;實際開發中往往是每次讀寫一個字串或者一個資料區塊,這樣能明顯提高效率。讀字串函數fgetsfgets() 函數用來從指定的檔案中讀取一個字串,並儲存到字元數組中,它的原型為:char *fgets ( char *str, int n, FILE *fp );str 為字元數組,n 為要讀取的字元數目,fp 為檔案指標。傳回值:讀取成功時返回字元數組首地址,也即 str;讀取失敗時返回
在C語言中,讀寫檔案比較靈活,既可以每次讀寫一個字元,也可以讀寫一個字串,甚至是任意位元組的資料(資料區塊)。本節介紹以字元形式讀寫檔案。以字元形式讀寫檔案時,每次可以從檔案中讀取一個字元,或者向檔案中寫入一個字元。主要使用兩個函數:fgetc()和fputc()。字元讀取函數 fgetcfgetc 是 file get char 的縮寫,意思是從指定的檔案中讀取一個字元。它的原型為:int fgetc (FILE *fp);fp 為檔案指標。fgetc()
C語言允許為一個資料類型起一個新的別名,就像給人起“綽號”一樣。起別名的目的不是為了提高程式運行效率,而是為了編碼方便。例如有一個結構體的名字是 stu,要想定義一個結構體變數就得這樣寫:struct stu stu1;struct 看起來就是多餘的,但不寫又會報錯。如果為 struct stu 起了一個別名 STU,書寫起來就簡單了:STU stu1;這種寫法更加簡練,意義也非常明確,不管是在標準標頭檔中還是以後的編程實踐中,都會大量使用這種別名。使用關鍵字 typedef
在C語言中,檔案操作都是由庫函數來完成的,這節介紹檔案的開啟和關閉。檔案的開啟(fopen函數)fopen() 函數用來開啟一個檔案,它的原型為:FILE *fopen(char *filename, char *mode);filename為檔案名稱(包括檔案路徑),mode為開啟檔案,它們都是字串。fopen()
所謂位元運算,就是對一個位元(Bit)位進行操作。在《二進位思想以及資料的儲存》一節中講到,位元(Bit)是一個電子元器件,8個位元構成一個位元組(Byte),它已經是粒度最小的可操作單元了。C語言提供了六種位元運算符: 運算子 & | ^ ~ << >> 說明 按位與 按位或 按位異或 取反 左移 右移
有些資料在儲存時並不需要佔用一個完整的位元組,只需要佔用一個或幾個二進位位即可。例如開關只有通電和斷電兩種狀態,用 0 和 1 表示足以,也就是用一個二進位。正是基於這種考慮,C語言又提供了一種叫做位域的資料結構。在結構體定義時,我們可以指定某個成員變數所佔用的二進位位元(Bit),這就是位域。請看下面的例子:struct bs{ unsigned m; unsigned n: 4; unsigned char ch: 6;}:後面的數字用來限定成員變數佔用的位元。成員 m
通過前面的講解,我們知道結構體(Struct)是一種構造類型或複雜類型,它可以包含多個類型不同的成員。在C語言中,還有另外一種和結構體非常類似的文法,叫做共用體(Union),它的定義格式為:union 共用體名{ 成員列表};共用體有時也被稱為聯合或者聯合體,這也是 Union
在實際編程中,有些資料的取值往往是有限的,只能是非常少量的整數,並且最好為每個值都取一個名字,以方便在後續代碼中使用,比如一個星期只有七天,一年只有十二個月,一個班每周有六門課程等。以每周七天為例,我們可以使用#define命令來給每天指定一個名字:#include <stdio.h>#define Mon 1#define Tues 2#define Wed 3#define Thurs 4#define Fri 5#define Sat 6#define Sun 7int
所謂結構體數組,是指數組中的每個元素都是一個結構體。在實際應用中,結構體數組常被用來表示一個擁有相同資料結構的群體,比如一個班的學生、一個車間的職工等。定義結構體數組和定義結構體變數的方式類似,請看下面的例子:struct stu{ char *name; //姓名 int num; //學號 int age; //年齡 char group; //所在小組 float score;
前面的教程中我們講解了數組(Array),它是一組具有相同類型的資料的集合。但在實際的編程過程中,我們往往還需要一群組類型不同的資料,例如對於學生資訊登記表,姓名為字串,學號為整數,年齡為整數,所在的學習小組為字元,成績為小數,因為資料類型不同,顯然不能用一個數組來存放。在C語言中,可以使用結構體(Struct)來存放一組不同類型的資料。結構體的定義形式為:struct 結構體名{
一個函數總是佔用一段連續的記憶體地區,函數名在運算式中有時也會被轉換為該函數所在記憶體地區的首地址,這和數組名非常類似。我們可以把函數的這個首地址(或稱入口地址)賦予一個指標變數,使指標變數指向函數所在的記憶體地區,然後通過指標變數就可以找到並調用該函數。這種指標就是函數指標。函數指標的定義形式為:returnType (*pointerName)(param list);returnType 為函數傳回值類型,pointerNmae 為指標名稱,param list
二維數組在概念上是二維的,有行和列,但在記憶體中所有的數組元素都是連續排列的,它們之間沒有“縫隙”。以下面的二維數組 a 為例:int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };從概念上理解,a 的分布像一個矩陣:0 1 2 34 5 6 78 9
如果一個數組中的所有元素儲存的都是指標,那麼我們就稱它為指標數組。指標數組的定義形式一般為:dataType *arrayName[length];[ ]的優先順序高於*,該定義形式應該理解為:dataType *(arrayName[length]);括弧裡面說明arrayName是一個數組,包含了length個元素,括弧外面說明每個元素的類型為dataType *。除了每個元素的資料類型不同,指標數組和普通數組在其他方面都是一樣的,下面是一個簡單的例子:#include <stdio.
C語言允許函數的傳回值是一個指標(地址),我們將這樣的函數稱為指標函數。下面的例子定義了一個函數 strlong(),用來返回兩個字串中較長的一個:#include <stdio.h>#include <string.h>char *strlong(char *str1, char *str2){ if(strlen(str1) >= strlen(str2)){ return str1; }else{ return str2; }}int