C 语言里的字符串---字符数组
生活随笔
收集整理的這篇文章主要介紹了
C 语言里的字符串---字符数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//????? 實際上, c中并沒有字符串這種數據類型,? 也就是說c是沒有像java, .net等其他高級語言中常用的String類型.
?????
????? 首先要強調:
????? a. c語言有無字符串????????? 有!
????? b. c語言有無字符串類型??? 無!
????? c. c語言字符串是否就是不是字符數組?? 是!
????? b. c語言字符串和字符數組是同一樣東西??? 不是!
???? 實際上,? c語言中, 字符串是1個特殊的字符數組,? 特殊在什么地方? 就是字符數組最后1個元素可以是任意字符, 而字符串(屬于字符數組的最后1個元素是'\000',
????? 也就是說, c
1.字符類型
char 就是c的字符類型
定義1個字符變量,跟住賦值.
char a;
a='a';?? //這里只能用單引號,? 雙引號只能用于字符數組.
打印這個字符:
printf("char a is %c",a)
?
2.字符數組
?? 由名字得知, 字符數組實際上是1個數組,其性質與數字型數組其實很類似的, 但是也有一些區別.
定義1個字符數組:
char c[5];? //:定義1個長度為5的字符數組,? 也就是有5個字符元素啦
char c[];?? // 錯誤,定義1個數組同時必須指定它的長度
賦值:
c[0]='a';c[1]='b';c[2]='c';c[3]='d';c[4]='e';??? //正確
c ="abcde";???? //錯誤
c={'a','b','c','d','e'}; //錯誤 因為c數組定義時已經設定了長度5, 而數組的長度一旦定義就不會改變, 所以c認為這種賦值不合法,因為有機會改變字符數組c的長度.
例子:
執行結果:
可以見到, 字符數組定義后, 賦值相當麻煩啊.? 而且不像數字型賦值, 不方便循環賦值..
所以一般在定義1個字符數組語句同時執行賦值:
char c[]={'a','b','c','d','e'}? //? 正確
這樣的話, 字符數組c在定義的同時它的各個元素和長度也被定義為5了.
char c[5]={'a','b','c','d','e'} //正確
char c[4]= {'a','b','c','d','e'}? //錯誤, 制定長度為4, 但是賦予5個元素
char c[7]={'a','b','c','d','e'} //正確, 但是c[5]和c[6]這兩個元素都被設為NULL '\000'? 注意不是'0'啊
例子:
?
執行結果:
可以見到d的長度是6, 但是d[5]的值顯示不出來,? 因為上面已經提過, 如果賦值的元素個數少于數組長度, 后面的元素會自動被賦值成'\0', 而'\0'是個空字符.
debug一下就可以看清楚了:
?
而這時字符數組d就是1個字符串了, 因為他是以'\000'結尾的字符數組啊!
3.字符串
???? 上面都提過很多次了,? 字符串是以'\000' 結尾的字符數組.
???? 定義1個字符串:
???? char c[]={'c','d','e','f','d','g','\000'}; // 長度為7
???? 而實際上還可以這樣定義:
???? char c[]="cdefdg"? // 系統會自動補1個Null字符'\000'到這個字符串的最后1個元素, 長度也是7
???? char c[7]="cdefdg" //正確? 這個是最常用的字符串變量賦值方法.
???? char c[6]="cdefdg"? //這個不是字符串, 長度不足以容納最后1個NULL字符'\000'
????
看個例子:
???執行結果:
?
?
上面c 于d都是字符串, 因為他們都是'\000'結尾的, 而e是1個普通的字符數組:
函數sizeof返回的是數組長度, 它會將'\000'計算在內
而函數strlen返回的是字符串長度, 它不會計算'\000'在內? <string.h>
所以對于字符串來講 sizeof(d) =7 它有7個元素嘛,? 但是strlen長度只有6
而對于一般字符串(沒有'\000'字符, sizeof 和 strlen 返回的結果是一樣的)
現在我修改一下這個函數, 令
字符串c的第4個字符c[4]='\000':
?
執行結果:
?
可以見到 字符串c 居然顯示3個字符"cde", 了 strlen長度也只有3
因為printf 函數 和strlen函數一樣, 都會從字符數組的頭1個元素往后面遍歷, 當遇到'\000'時,就會認為這是1個字符串, 而且會在這里結束.
4. 一些指針的意思:
??? ? ?? 定義1個字符串:
???????? char c[]="abcdef"; //
???????? 這樣c就是1個長度為7的字符數組(也是字符串)c,c的元素包括 'a','b','c','d','e','f','\000', 上面已經解析過了.
???????? 而實際上, 跟int類型的數組名一樣, 這里的字符串(也是字符數組)名字c本身就是1個字符型指針,? 它指向數組c的一個的元素c[0]的地址.
???????? 也就是講:
???????? *c == c[0] = 'a'
???????? *(c+1) = c[1] = 'b'
???????? *(c+i) = c(i)?? //這個是經典公式啊.
?? 也可以定義1個字符型指針*p
???????? char *p;
??
??? 給p賦值:
??? p=c;?? //因為數組名c也是指針啊, 所以不需要取址符&,? p=&c;是錯誤的!
??? 這樣, p與c就是等價的(指向同1個地址
??? *p == c[0] = 'a' = p[0]
??? *(c+1) = c[1] = 'b' = p[1]
??? *(p+i) = p(i)=c(i) ? //這個是經典公式啊.
有另1個種定義數組的方法:
?????? char *q = "abcdef"? ,
?????? 這樣指針q也是只向1個字符串. 用法跟上面指針p差不多
例子:
輸出:
可以見到:
1. 用數組c的長度是7(sizeof(c)), 而字符串長度是6(strlen).
??? 而用指針p去只想數組c, 求sizeof(p) 是多了1個元素的, 尾部多1個'\000',就是兩個'\000'結尾啦, 但是字符串長度是一樣的.
2. 可以見到 sizeof 和 strlen的參數實際上都是指針(c和p和q)都是指針.
所以在c語言中, 有很多函數的參數實際上都是指針, 這就是用地址傳遞產生了
例如
int strlen(char* p){???? //這里char* p表示p是1個字符型參數,? 而定義1個字符串p使用char *p;的 注意區別~
}
見到輸出, p與q的部分是完全一樣的,
是否p與q的用法就完全一樣呢?
不是的
首先我定義字符串c時:
char c[]="abcdef"?
這個c是1個字符串變量
?
那么p=c;? p就指向1個字符串變量了
執行
p[1] = 'k';
p[2] ='h';? //都是合法的, 因為變量的值可以改變嘛
而定義1個字符指針q
char *p="abcdef"; 時
首先系統會定義1個字符串常量"abcdef",
然后指針p指向這個常量.
執行
q[1]='k'; 是不合法的, 因為常量的值不能修改, 所以里面的元素的值也不允許的修改的.
所以要定義1個字符串, 而且打算修改時 不要用
?char *p="abcdef";?
這種方式, 但是用于常量時就推薦這種~
????????
?
???
????
?
?
?
?????
????? 首先要強調:
????? a. c語言有無字符串????????? 有!
????? b. c語言有無字符串類型??? 無!
????? c. c語言字符串是否就是不是字符數組?? 是!
????? b. c語言字符串和字符數組是同一樣東西??? 不是!
???? 實際上,? c語言中, 字符串是1個特殊的字符數組,? 特殊在什么地方? 就是字符數組最后1個元素可以是任意字符, 而字符串(屬于字符數組的最后1個元素是'\000',
????? 也就是說, c
1.字符類型
char 就是c的字符類型
定義1個字符變量,跟住賦值.
char a;
a='a';?? //這里只能用單引號,? 雙引號只能用于字符數組.
打印這個字符:
printf("char a is %c",a)
?
2.字符數組
?? 由名字得知, 字符數組實際上是1個數組,其性質與數字型數組其實很類似的, 但是也有一些區別.
定義1個字符數組:
char c[5];? //:定義1個長度為5的字符數組,? 也就是有5個字符元素啦
char c[];?? // 錯誤,定義1個數組同時必須指定它的長度
賦值:
c[0]='a';c[1]='b';c[2]='c';c[3]='d';c[4]='e';??? //正確
c ="abcde";???? //錯誤
c={'a','b','c','d','e'}; //錯誤 因為c數組定義時已經設定了長度5, 而數組的長度一旦定義就不會改變, 所以c認為這種賦值不合法,因為有機會改變字符數組c的長度.
例子:
執行結果:
可以見到, 字符數組定義后, 賦值相當麻煩啊.? 而且不像數字型賦值, 不方便循環賦值..
所以一般在定義1個字符數組語句同時執行賦值:
char c[]={'a','b','c','d','e'}? //? 正確
這樣的話, 字符數組c在定義的同時它的各個元素和長度也被定義為5了.
char c[5]={'a','b','c','d','e'} //正確
char c[4]= {'a','b','c','d','e'}? //錯誤, 制定長度為4, 但是賦予5個元素
char c[7]={'a','b','c','d','e'} //正確, 但是c[5]和c[6]這兩個元素都被設為NULL '\000'? 注意不是'0'啊
例子:
?
執行結果:
可以見到d的長度是6, 但是d[5]的值顯示不出來,? 因為上面已經提過, 如果賦值的元素個數少于數組長度, 后面的元素會自動被賦值成'\0', 而'\0'是個空字符.
debug一下就可以看清楚了:
?
而這時字符數組d就是1個字符串了, 因為他是以'\000'結尾的字符數組啊!
3.字符串
???? 上面都提過很多次了,? 字符串是以'\000' 結尾的字符數組.
???? 定義1個字符串:
???? char c[]={'c','d','e','f','d','g','\000'}; // 長度為7
???? 而實際上還可以這樣定義:
???? char c[]="cdefdg"? // 系統會自動補1個Null字符'\000'到這個字符串的最后1個元素, 長度也是7
???? char c[7]="cdefdg" //正確? 這個是最常用的字符串變量賦值方法.
???? char c[6]="cdefdg"? //這個不是字符串, 長度不足以容納最后1個NULL字符'\000'
????
看個例子:
???執行結果:
?
?
上面c 于d都是字符串, 因為他們都是'\000'結尾的, 而e是1個普通的字符數組:
函數sizeof返回的是數組長度, 它會將'\000'計算在內
而函數strlen返回的是字符串長度, 它不會計算'\000'在內? <string.h>
所以對于字符串來講 sizeof(d) =7 它有7個元素嘛,? 但是strlen長度只有6
而對于一般字符串(沒有'\000'字符, sizeof 和 strlen 返回的結果是一樣的)
現在我修改一下這個函數, 令
字符串c的第4個字符c[4]='\000':
?
執行結果:
?
可以見到 字符串c 居然顯示3個字符"cde", 了 strlen長度也只有3
因為printf 函數 和strlen函數一樣, 都會從字符數組的頭1個元素往后面遍歷, 當遇到'\000'時,就會認為這是1個字符串, 而且會在這里結束.
4. 一些指針的意思:
??? ? ?? 定義1個字符串:
???????? char c[]="abcdef"; //
???????? 這樣c就是1個長度為7的字符數組(也是字符串)c,c的元素包括 'a','b','c','d','e','f','\000', 上面已經解析過了.
???????? 而實際上, 跟int類型的數組名一樣, 這里的字符串(也是字符數組)名字c本身就是1個字符型指針,? 它指向數組c的一個的元素c[0]的地址.
???????? 也就是講:
???????? *c == c[0] = 'a'
???????? *(c+1) = c[1] = 'b'
???????? *(c+i) = c(i)?? //這個是經典公式啊.
?? 也可以定義1個字符型指針*p
???????? char *p;
??
??? 給p賦值:
??? p=c;?? //因為數組名c也是指針啊, 所以不需要取址符&,? p=&c;是錯誤的!
??? 這樣, p與c就是等價的(指向同1個地址
??? *p == c[0] = 'a' = p[0]
??? *(c+1) = c[1] = 'b' = p[1]
??? *(p+i) = p(i)=c(i) ? //這個是經典公式啊.
有另1個種定義數組的方法:
?????? char *q = "abcdef"? ,
?????? 這樣指針q也是只向1個字符串. 用法跟上面指針p差不多
例子:
輸出:
可以見到:
1. 用數組c的長度是7(sizeof(c)), 而字符串長度是6(strlen).
??? 而用指針p去只想數組c, 求sizeof(p) 是多了1個元素的, 尾部多1個'\000',就是兩個'\000'結尾啦, 但是字符串長度是一樣的.
2. 可以見到 sizeof 和 strlen的參數實際上都是指針(c和p和q)都是指針.
所以在c語言中, 有很多函數的參數實際上都是指針, 這就是用地址傳遞產生了
例如
int strlen(char* p){???? //這里char* p表示p是1個字符型參數,? 而定義1個字符串p使用char *p;的 注意區別~
}
見到輸出, p與q的部分是完全一樣的,
是否p與q的用法就完全一樣呢?
不是的
首先我定義字符串c時:
char c[]="abcdef"?
這個c是1個字符串變量
?
那么p=c;? p就指向1個字符串變量了
執行
p[1] = 'k';
p[2] ='h';? //都是合法的, 因為變量的值可以改變嘛
而定義1個字符指針q
char *p="abcdef"; 時
首先系統會定義1個字符串常量"abcdef",
然后指針p指向這個常量.
執行
q[1]='k'; 是不合法的, 因為常量的值不能修改, 所以里面的元素的值也不允許的修改的.
所以要定義1個字符串, 而且打算修改時 不要用
?char *p="abcdef";?
這種方式, 但是用于常量時就推薦這種~
????????
?
???
????
?
?
?
總結
以上是生活随笔為你收集整理的C 语言里的字符串---字符数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 关于减号 - 代替stdin
- 下一篇: C语言中, 有些时候数值名并不与指针等价