字元陣列,字元指標,字串常量

2021-09-26 03:59:31 字數 3406 閱讀 8976

一、字串可以賦值給字元指標變數

char* p="hello";//其實這裡分配了常量,即const,如果不讓p指向別的位址就無法修改。

char q="world";

cout<<&p<<" "<<&q<<" "<1.字串常量"hello"出現在乙個表示式中時,"hello"表示式使用的值就是這些字元所儲存的位址(在常量區),而不是這些字元本身。所以,可以把字串賦值給指向字元的指標p,而不能把字串賦值給乙個字元陣列。 

同樣是q陣列,char q[10] = 「hello」;這種是陣列的初始化,和a[0] = 『h』 a[1] = 『e』…是乙個道理

但是換成char a [10],然後a = 「hello」就不行了 。「hello」賦值的值是乙個位址,而a雖然也有位址,但是這與指標是不一樣的,指標的值是位址,而陣列的值雖然也是位址,但是卻是乙個常量,所以不能給常量賦值。

3.特別需要注意的是,在void指標使用的時候,不能使用指標運算,應為void型編譯器不能識別型別的長度(即指標所指物件的體積),p++這樣就是不合法的,即不能進行數**算,也不能使用*取值操作,想使用必須轉換為其它的型別。

二、1.以字串形式出現的,編譯器都會為該字串自動新增乙個0作為結束符,如在**中寫 "abc",那麼編譯器幫你儲存的是"abc\0"。

2."abc"是常量嗎?答案是有時是,有時不是。

不是常量的情況:"abc"作為字元陣列初始值的時候就不是,如

char str = "abc";

因為定義的是乙個字元陣列,所以就相當於定義了一些空間來存放"abc",而又因為字元陣列就是把字元乙個乙個地存放的,所以編譯器把這個語句解析為

char str[3] = ;

又根據上面的總結1,所以char str = "abc";的最終結果是

char str[4] = ;

做一下擴充套件,如果char str = "abc";是在函式內部寫的話,那麼這裡的"abc\0"因為不是常量,所以應該被放在棧上。

是常量的情況:  把"abc"賦給乙個字元指標變數時,如

char* ptr = "abc";

因為定義的是乙個普通字元指標,並沒有定義空間來存放"abc",所以編譯器得幫我們找地方來放"abc",顯然,把這裡的"abc"當成常量並把它放到程式的常量區是編譯器最合適的選擇。所以儘管ptr的型別不是const char*,並且ptr[0] = 'x';也能編譯通過,但是執行ptr[0] = 'x';就會發生執行時異常,因為這個語句試圖去修改程式常量區中的東西。

記得哪本書中曾經說過char* ptr = "abc";這種寫法原來在c++標準中是不允許的,但是因為這種寫法在c中實在是太多了,為了相容c,不允許也得允許。雖然允許,但是建議的寫法應該是const char* ptr = "abc";這樣如果後面寫ptr[0] = 'x'的話編譯器就不會讓它編譯通過,也就避免了上面說的執行時異常。

又擴充套件一下,如果char* ptr = "abc";寫在函式體內,那麼雖然這裡的"abc\0"被放在常量區中,但是ptr本身只是乙個普通的指標變數,所以ptr是被放在棧上的,只不過是它所指向的東西被放在常量區罷了。

3.陣列的型別是由該陣列所存放的東西的型別以及陣列本身的大小決定的。

如char s1[3]和char s2[4],s1的型別就是char[3],s2的型別就是char[4],

也就是說儘管s1和s2都是字元陣列,但兩者的型別卻是不同的。

4.字串常量的型別可以理解為相應字元常量陣列的型別

如"abcdef"的型別就可以看成是const char[7]

5.sizeof是用來求型別的位元組數的。如int a;那麼無論sizeof(int)或者是sizeof(a)都

是等於4,因為sizeof(a)其實就是sizeof(type of a)

6.對於函式引數列表中的以陣列型別書寫的形式引數,編譯器把其解釋為普通

的指標型別,如對於void func(char sa[100],int ia[20],char *p)則sa的型別為char*,ia的型別為int*,p的型別為char*

7.根據上面的總結,來實戰一下:

對於char str = "abcdef";就有sizeof(str) == 7,因為str的型別是char[7],

也有sizeof("abcdef") == 7,因為"abcdef"的型別是const char[7]。

對於char *ptr = "abcdef";就有sizeof(ptr) == 4,因為ptr的型別是char*。

對於char str2[10] = "abcdef";就有sizeof(str2) == 10,因為str2的型別是char[10]。

對於void func(char sa[100],int ia[20],char *p);

就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,

因為sa的型別是char*, ia的型別是int*,p的型別是char*。

8.定義的字串方式舉例:

字串定義其實很簡單在c/c++語言中定義乙個字串可以使用如下的語法:

char *s1=「string1」;//定義字串常量,指標形式

char s2=「string2」;//定義字串常量,陣列形式

char *s3=new char[10];//定義字串變數並分配記憶體 指標形式

strcpy(s3,"string3");//為s3賦值

char s4[10];//定義字串變數,陣列形式

strcpy(s4,"string4");//為s4賦值

以上四種方法都能定義乙個字串,同時通過字串在記憶體中的分布可以清楚地知道是什麼情況。

9.

char day[15] = "abcdefghijklmn";

char* strtmp = "opqrstuvwxyz";

printf("&day is %x\n",&day);

printf("&day[0] is %x\n",&day[0]);

printf("day is %x\n",day);

printf("\n&strtmp is %x\n",&strtmp);

printf("&strtmp[0] is %x\n",&strtmp[0]);

printf("strtmp is %x\n",strtmp);

三、模擬strcpy

char* test_strcpy(char *dst,const char *src)

// dst[i] = '\0';

return ret;

}

C C 字串常量 字元陣列和字元指標

通常,如果在程式中定義了乙個字串,那麼為了節省記憶體,會把相同的字串儲存到乙個單獨的 相同的位置,此時如果用多個字元指標指向它,那麼指標的值會相同。常量字串位於c c 的文字常量區,在程式結束以後由系統釋放。char p string1 example char p string2 example ...

C C 字元陣列 字元指標和字串常量

c 有兩種處理字串的方式,除了沿用c風格字串,另一種方法是借助用string class庫。字串是一系列儲存在連續記憶體位元組中的字元 每個字元對應乙個位元組 所以可以將字串儲存在字元陣列中。以下四種宣告方式都是字元陣列,但是只有第乙個不是字串,其中無效字元 null character 0 其在機...

C 字元 字串 字元陣列 字串指標 指標陣列

一 c 字元 字串 字元陣列 字串指標 指標陣列 前言 一 字元指標 字元陣列 二 字串指標 三 字串 指標陣列 四 常用方法 參考為了深入理解c 並時常回顧學過的知識點,對c 知識點進行記錄總結。參考1字元指標的儲存方式 字元指標變數本身是乙個變數,用於存放字元 字串的首位址。字串本身是存放在以該...