通常編譯器在「肉眼所能看見的」字元陣列末尾還會加乙個「\0」作為結束符
所以真正的字元長度是「肉眼所見長度」+1
char str[5]
="hello"
;
如上**是會編譯錯誤的
一.指標和一維字元陣列
#include
#include
#include
using
namespace std;
intmain()
之前的blog已經介紹過,指標可以當做陣列用
c語言陣列作為函式引數及指標與陣列的關係
但是指標和字元陣列並不完全相同
1.指標被當做字元陣列初始化之後單個字元不可以被直接賦值,s被儲存在一段唯讀區域中
char
*s="hello world"
;char
*s2=
"hello world"
; s[0]
='b'
;//這一段會報錯,s[0]屬於唯讀區域
printf
("s[0]=%c\n"
,s[0])
;
若要修改,需用字元陣列
如下:
char s3=
"hello world"
;printf
("s= %p\n"
,s);
printf
("s2=%p\n"
,s2)
; s3[0]
='b'
;printf
("s3[0]=%c\n"
,s3[0]
);
2.指標雖然無法修改單個字元,但可以直接將整個字串換掉,也就是直接指向另乙個字串如下:
#include
#include
#include
using
namespace std;
intmain()
執行結果:![](https://pic.w3help.cc/39b/f6931b5bf1c1530b8ab92ac47d428.jpeg)
可以看到,ptr指向的值已經被換掉了,而**中隱掉的s="xyz"是違規操作,會編譯錯誤 定義了字元陣列之後不能對該字元陣列進行直接賦值
3.對於字元型指標變數在沒有指向字元陣列的時候 除了一開始可以令指標變數指向乙個常量儲存區外 之後如果想要讀入新的資料必須開闢新的記憶體空間
第一種:未開闢新的記憶體空間(執行時會報錯)
#include
#include
#include
#include
using
namespace std;
intmain()
第二種:開闢新的記憶體空間
#include
#include
#include
#include
using
namespace std;
intmain()
執行結果
二.指標和多維字元陣列
我們知道,對於二維陣列而言,它的第二維的大小不可省略
前面已經提過 (star)a 可以作為一維陣列使用,同樣的*a也可以作為二維陣列使用
下面我們用一張圖來進行對比
1.scanf("%s",string);讀到空格/回車/tab
2.相對安全的輸入
scanf("%7s",s);(給定讀入的字串長度,不過依然不能讀空格)
3.getchar() putchar() (輸入輸出乙個字元)
char ch;
while
((ch=
getchar()
)!=eof)
4.gets() puts()可以錄入空格 (回車符結束)
1.strcpy
具體操作
#include
#include
#include
using
namespace std;
intmain()
執行結果
所以,s1實際上變成了
123\0efghijklmn(中間有個結束符)
2.strcat(s1,s2); 把s2接到s1後面
1.未對指標初始化
如
char
*string;
scanf
("%s"
,string)
;
string指向未知記憶體,容易出錯,要初始化為 C語言 字串指標(指向字串的指標)
字串一旦被建立就存在於常量池中。以字元陣列形式建立的字串,實際上是從字串常量池中複製了乙個副本,所以修改字元陣列的內容時,只是修改的自己的副本,並不會影響到常量池中的字串。而對字串指標strp操作時會影響到常量池中的字串 char strc string char strp string print...
C語言的字元陣列,字串,字串常量
首先來看一段源 include int main 剩餘部分為 0 char brr 不是字串,因為沒有 0 char crr 10 字元陣列特有 char drr 10 abc 字元陣列特有 char err abc 字元陣列特有 char frr 10 printf s n arr printf ...
C語言,字串的處理,陣列字串,指標字串。
c語言菜鳥教程 void memset void str,int c,size t n 複製字元 c 乙個無符號字元 到引數 str 所指向的字串的前 n 個字元。size t strlen const char str 計算字串 str 的長度,直到空結束字元,但不包括空結束字元。char str...