
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整型提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if語句
- C語言 - if...else語句
- C語言 - 巢狀if語句
- C語言 - switch語句
- C語言 - 巢狀switch語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while迴圈
- C語言 - for迴圈
- C語言 - do...while迴圈
- C語言 - 巢狀迴圈
- C語言 - 死迴圈
- C語言 - break語句
- C語言 - continue語句
- C語言 - goto語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 變參函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(enum)
- C語言 - 結構體填充和壓縮
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入和輸出
- C語言 - 檔案I/O (檔案處理)
- C預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言中的字元指標和函式
什麼是C語言中的字元指標?
字元指標儲存字元型別或字元陣列(字串)第一個字元的地址。當您處理字串時,字元指標非常有用。
C語言中沒有字串資料型別。“char”型別的陣列被視為字串。因此,char型別陣列的指標代表一個字串。然後可以將此char指標作為引數傳遞給函式來處理字串。
宣告字元指標
字元指標指向字元或字元陣列。因此,要宣告字元指標,請使用以下語法:
char *pointer_name;
初始化字元指標
宣告字元指標後,需要用字元變數的地址對其進行初始化。如果有字元陣列,只需提供字元陣列的名稱或其第一個元素的地址即可初始化字元指標。
字元的字元指標
以下是初始化字元型別字元指標的語法:
char *pointer_name = &char_variable;
字元陣列的字元指標
以下是初始化字元陣列(字串)字元指標的語法:
char *pointer_name = char_array; /*or*/ char *pointer_name = &char_array[0];
字元指標示例
在下面的示例中,我們有兩個變數字元和字元陣列。我們正在獲取兩個指標變數來儲存字元和字元陣列的地址,然後使用字元指標列印變數的值。
#include <stdio.h> int main() { // Declare two variables char x = 'P'; char arr[] = "TutorialsPoint"; // Declaring character pointers char *ptr_x = &x; char *ptr_arr = arr; // Printing values printf("Value of x : %c\n", *ptr_x); printf("Value of arr: %s\n", ptr_arr); return 0; }
輸出
執行程式碼並檢查其輸出:
Value of x : P Value of arr: TutorialsPoint
理解字元指標
字串宣告為如下陣列:
char arr[] = "Hello";
字串是空終止的字元陣列。上述陣列中的最後一個元素是空字元(\0)。
宣告char型別的指標併為其賦值第0個位置的字元地址:
char *ptr = &arr[0];
請記住,陣列的名稱本身就是第0個元素的地址。
char *ptr = arr;
可以使用指標而不是陣列變數(無方括號)來宣告字串。
char *ptr = "Hello";
這會導致字串儲存在記憶體中,其地址儲存在ptr中。我們可以透過遞增ptr來遍歷字串。
while(*ptr != '\0'){ printf("%c", *ptr); ptr++; }
訪問字元陣列
如果使用%s格式說明符列印字元陣列,可以使用字元指標的名稱來實現。但是,如果要訪問字元陣列的每個字元,則必須在字元指標名稱之前使用星號(*),然後遞增它。
示例
這是完整的程式程式碼:
#include <stdio.h> int main(){ char arr[] = "Character Pointers and Functions in C"; char *ptr = arr; while(*ptr != '\0'){ printf("%c", *ptr); ptr++; } }
輸出
執行程式碼並檢查其輸出:
Character Pointers and Functions in C
示例
或者,將ptr以%s格式傳遞給printf()來列印字串。
#include <stdio.h> int main(){ char arr[] = "Character Pointers and Functions in C"; char *ptr = arr; printf("%s", ptr); }
輸出
執行此程式碼後,您將獲得相同的輸出:
Character Pointers and Functions in C
字元指標函式
"string.h"標頭檔案定義了許多執行字串處理的庫函式,例如查詢字串的長度、複製字串和比較兩個字串。這些函式使用char指標引數。
strlen()函式
strlen()函式返回字串的長度,即字串中的字元數。strlen()函式的原型如下:
int strlen(char *)
示例1
以下程式碼顯示如何列印字串的長度:
#include <stdio.h> #include <string.h> int main(){ char *ptr = "Hello"; printf("Given string: %s \n", ptr); printf("Length of the string: %d", strlen(ptr)); return 0; }
執行此程式碼時,它將產生以下輸出:
Given string: Hello Length of the string: 5
示例2
實際上,strlen()函式根據如下所示的使用者定義函式str_len()計算字串長度:
#include <stdio.h> #include <string.h> int str_len(char *); int main(){ char *ptr = "Welcome to Tutorialspoint"; int length = str_len(ptr); printf("Given string: %s \n", ptr); printf("Length of the string: %d", length); return 0; } int str_len(char *ptr){ int i = 0; while(*ptr != '\0'){ i++; ptr++; } return i; }
執行此程式碼時,它將產生以下輸出:
Given string: Welcome to Tutorialspoint Length of the string: 25
strcpy()函式
賦值運算子(=)不用於將字串值賦值給字串變數,即char指標。相反,我們需要使用strcpy()函式,其原型如下:
char * strcpy(char * dest, char * source);
示例1
以下示例顯示如何使用strcpy()函式:
#include <stdio.h> #include <string.h> int main(){ char *ptr = "How are you doing?"; char *ptr1; strcpy(ptr1, ptr); printf("%s", ptr1); return 0; }
strcpy()函式返回指向目標字串ptr1的指標。
How are you doing?
示例2
在內部,strcpy()函式在使用者定義的str_cpy()函式中實現以下邏輯:
#include <stdio.h> #include <string.h> void str_cpy(char *d, char *s); int main(){ char *ptr = "Using the strcpy() Function"; char *ptr1; str_cpy(ptr1, ptr); printf("%s", ptr1); return 0; } void str_cpy(char *d, char *s){ int i; for(i = 0; s[i] != '\0'; i++) d[i] = s[i]; d[i] = '\0'; }
執行此程式碼時,它將產生以下輸出:
Using the strcpy() Function
該函式將每個字元從源字串複製到目標字串,直到遇到空字元"\0"。迴圈結束後,它會在目標陣列末尾新增一個"\0"字元。
strcmp()函式
通常的比較運算子(<,>,<=,>=,==和!=)不允許用於比較兩個字串。相反,我們需要使用"string.h"標頭檔案中的strcmp()函式。此函式的原型如下:
int strcmp(char *str1, char *str2)
strcmp()函式有三個可能的返回值:
- 當發現兩個字串相同時,它返回“0”。
- 當str1中第一個不匹配的字元的ASCII值大於str2中對應字元的ASCII值時,函式返回正整數。這意味著str1按字母順序出現在str2之後,就像在字典中一樣。
- 當str1中第一個不匹配的字元的ASCII值小於str2中對應字元的ASCII值時,函式返回負整數。這意味著str1按字母順序出現在str2之前,就像在字典中一樣。
示例1
以下示例演示如何在C程式中使用strcmp()函式:
#include <stdio.h> #include <string.h> int main(){ char *s1 = "BASK"; char *s2 = "BALL"; int ret = strcmp(s1, s2); if (ret == 0) printf("Both strings are identical\n"); else if (ret > 0) printf("The first string appears after the second string \n"); else printf("The first string appears before the second string \n"); return 0; }
執行程式碼並檢查其輸出:
The first string appears after the second string
將s1更改為BACK並再次執行程式碼。現在,您將獲得以下輸出:
The first string appears before the second string
示例2
您可以使用使用者定義的函式str_cmp()獲得類似的結果,如下面的程式碼所示:
#include <stdio.h> #include <string.h> int str_cmp(char *str1, char *str2); int main(){ char *s1 = "The Best C Programming Tutorial Available Online"; char *s2 = "The Best C Programming Tutorial Available Online"; int ret = str_cmp(s1, s2); if (ret == 0) printf("Both strings are identical\n"); else if (ret > 0) printf("The first string appears after the second string\n"); else printf("The first string appears before the second string\n"); return 0; } int str_cmp(char *str1, char *str2) { while (*str1 != '\0' && *str2 != '\0') { if (*str1 != *str2) { return *str1 - *str2; } str1++; str2++; } // If both strings are equal, return 0 return 0; }
執行此程式碼時,它將產生以下輸出:
Both strings are identical
str_cmp() 函式比較兩個字串中相同索引處的字元,直到其中一個字串的字元耗盡或找到相等的字元。
當檢測到相同索引處字元不相等時,返回其ASCII值之差。如果迴圈終止,則返回“0”。