字符串
在 C 語言中,字符串實際上是使用 null 字符 '\0' 終止的一維字符數組。因此,一個以 null 結尾的字符串,包含了組成字符串的字符。聲明和初始化創建了一個 字符串:
char charArrayName[capacity] = {charElement1,charElement2...}
其實,不需要把 null 字符放在字符串常量的末尾。C 編譯器會在初始化數組時,自動把 '\0' 放在字符串的末尾。
C 中有大量操作字符串的函數(不止下表中列出的):
序號 | 函數 & 目的 |
---|---|
1 | strcpy(s1, s2); 複製字符串 s2 到字符串 s1。 |
2 | strcat(s1, s2); 連接字符串 s2 到字符串 s1 的末尾。 |
3 | strlen(s1); 返回字符串 s1 的長度。 |
4 | strcmp(s1, s2); 如果 s1 和 s2 是相同的,則返回 0;如果 s1<s2 則返回小於 0;如果 s1>s2 則返回大於 0。 |
5 | strchr(s1, ch); 返回一個指針,指向字符串 s1 中字符 ch 的第一次出現的位置。 |
6 | strstr(s1, s2); 返回一個指針,指向字符串 s1 中字符串 s2 的第一次出現的位置。 |
結構體
C 中數組允許定義可存儲相同類型數據項的變量,結構是 C 編程中另一種用戶自定義的可用的數據類型,它允許存儲不同類型的數據項。
聲明結構體和結構體變量
struct 語句定義了一個包含多個成員的新的數據類型,struct 語句的格式如下:
struct structTag {
type1 attrVarName;
type2 attrVarName;
...
typeN attrVarName;
} structVarName1,structVarName2,...,structVarNameN;
在一般情況下,structTag(結構體標籤(類名))、typei attrVarName;(成員屬性定義)、objectvarNamei (實例化變量名(對象))這 3 部分至少要出現 2 個。
對聲明進行下列舉例說明:
//此聲明聲明瞭擁有3個成員(整型的a,字符型的b和雙精度的c)並且沒有標明其標籤的結構體,聲明瞭結構體變量s1。
struct
{
int a;
char b;
double c;
} s1;
//此聲明聲明瞭擁有3個成員並且標籤命名爲SIMPLE的結構體,沒有聲明結構體變量
struct SIMPLE
{
int a;
char b;
double c;
};
//用SIMPLE標籤的結構體,另外聲明瞭結構體變量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
上述的兩種聲明中,SIMPLE聲明的結構體變量和s1是兩個完全不同的類型。
我們也可以用typedef關鍵字來創建一個新類型,其中,Simpler爲創建的新類型名,隨後可以用它來創建此類型的實例變量。示例如下:
typedef struct
{
int a;
char b;
double c;
} Simple2;
//現在可以用Simple2作爲類型聲明新的結構體變量
Simple2 u1, u2[20], *u3;
結構體的成員可以包含其他結構體,也可以包含指向自己結構體類型的指針,比如實現鏈表和樹等數據結構。
1. 聲明包含了其他的結構體
struct COMPLEX
{
char string[100];
struct SIMPLE a;
};
2. 聲明包含了指向自己類型的指針
struct NODE
{
char string[100];
struct NODE *next_node;
};
3. 兩個結構體互相包含,則需要對其中一個結構體進行不完整聲明
struct B; //對結構體B進行不完整聲明
//結構體A中包含指向結構體B的指針
struct A
{
struct B *partner;
//other members;
};
//結構體B中包含指向結構體A的指針,在A聲明完後,B也隨之進行聲明
struct B
{
struct A *partner;
//other members;
};
結構體變量的初始化
和其它類型變量一樣,對結構體變量可以在定義時指定初始值。
訪問結構成員
使用成員訪問運算符(.)。成員訪問運算符是結構變量名稱和我們要訪問的結構成員之間的一個英文句號;
結構作爲函數參數
指向結構的指針
以定義指向結構的指針,方式與定義指向其他類型變量的指針相似,語法如下:
//聲明
struct structTag *structPointer;
//初始化
structPointer = &structVarName
使用指向該結構的指針訪問該結構的成員時,請必須使用 -> 運算符。
//book爲指向 Books類型的結構體變量book1 的 Books類型的結構體指針(指向變量的指針類型需和變量的類型相同)
void printBook( struct Books *book )
{
printf( "Book title : %s\n", book->title);
printf( "Book author : %s\n", book->author);
printf( "Book subject : %s\n", book->subject);
printf( "Book book_id : %d\n", book->book_id);
}
int main(){
struct Books Book1; /* 聲明 Book1,類型爲 Books */
/* Book1 成員初始化 */
//字符串成員變量使用strcpy初始化
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
printBook( &Book1 );
}
共用體
共用體是一種特殊的數據類型,允許在同一內存位置存儲不同的數據類型。可以定義一個帶有多成員的共用體,但是任何時刻只能有其中一個成員帶有值。
定義共用體
使用 union 語句,方式與定義結構類似。union 語句定義了一個新的數據類型,帶有多個成員。union 語句的格式如下:
union unionTag
{
member definition;
member definition;
...
member definition;
} one or more unionVariables;
unionTag ,unionVariables都是可選的。共用體佔用的內存應足夠存儲共用體中最大的成員。
訪問共用體成員
訪問共用體的成員,我們使用成員訪問運算符(.)。使用 union 關鍵字來定義共用體類型的變量,方法和struct相同:
union unionTag unionVar
所有的成員都能完好輸出的前提是同一時間只用到一個成員,後初始化的共用體成員會覆蓋之前初始化的。