c語言 如何用指標來處理字串?
阿新 • • 發佈:2019-01-22
文章目錄
讀者,你好!
如果你精通C,希望能得到你的斧正;如果你是初學者,希望能對你有所幫助。
加粗的是一些我認為比較重要的內容。
#一、字元指標
##1、字元指標輸出字串
為了更好的理解這部分內容,我們先看一個例子:
#include <stdio.h>
int main()
{
char *ps ;
ps = "C language!"; /*定義字元指標*/
printf("%s\n", ps); /*用字元指標PS來輸出字串的內容*/
return 0;
}
執行結果為:
這個列子中,字串“C language!”, 儲存在連續的無名儲存區中,通過語句ps = "C language!
|C| |l|a|n|g|u|a|g|e|!|\0|
|—|-----|----|----|----|
ps^
##2、字元指標處理字串
還是從具體的列子出發:
#include <stdio.h>
int main()
{
char *ps = "C language!";
int n = 2;
ps = ps+2; /*移動指標ps*/
printf("%s\n", ps);
return 0;
}
執行結果:
這裡初始化的時候把首地址賦給了ps , 後面操作ps= ps+2
l
所在的空間。##3、字元陣列與字元指標處理字串有何不同
- 佔用空間不同。陣列所佔空間取決於陣列的長度,而指標只佔用4位元組,用以存放字串的首地址。
- 賦值方式不同指標本身是變數,所以可以這樣
char *ps; ps = "C language!";
賦值, 而陣列不能這樣char A[20];A = "C language!
;賦值,而要逐個賦值。
#二、指標陣列
## 指標陣列的說明形式
語法 | 型別識別符號 *陣列名[整形常量表達式]; |
---|---|
樣列 | int *p[3]; |
說明 | “int *p[3];”表示p是一個指標陣列名,他有三個元素p[0],p1],p[2],每個元素都是一個指標,而這些指標都指向整形變數。 |
注意不要寫成int (*p)[3];
這是上一篇說的指向陣列的指標變數,表示長度為3的指向一維陣列的指標變數。
-
指標陣列比較適合於用來指向若干個字串,是字串處理更加靈活方便。
-
比如圖書館有若干本書,要將這些書名存在一個數組中,一般的方法用二維陣列來存,就得定義該字元陣列的列數為最長書名的長度,這樣就非常浪費空間。
-
用指標陣列則可以讓指標陣列中的各個元素,指向各字串(書名),這樣排序時,不必改動字串的位置,而是改動指標陣列中個元素的指向。
-
這樣,各字串的元素可以不同,而且移動指標變數的值(地址),就比移動字串所花的時間少得多。
#include <stdio.h>
#include <string.h>
#define N 5
int main()
{
char *name[N] = {"Data Structure", "Programming C", "Java", "Operating System", "Data base"};
char *temp;
int i, j, front;
for(i = 0; i < N -1;i++)
{
front = i; //假設按字典順序,第i個書名應位於前
for(j= i + 1;j < N;j++)
{
if(strcmp(name[front], name[j]) > 0)//判斷其先後順序是否合理
{
front = j;
}
}
if(front != i) //若順序不合理,也就是原先的假設不成立,交換指標的值(地址)
{
temp = name[front];
name[front] = name[i];
name[i] = temp;
}
}
for(i= 0;i<N;i++)
{
printf("%s\n", name[i]);
}
return 0 ;
}
執行結果:
這段演算法,後面部分與一般的陣列差不多,但其效率卻比較高。
送福利了