char 和char 的區別和小結

2021-07-27 08:30:22 字數 1834 閱讀 1272

原**:

char *s1 = "hello";

char s2 = "hello";

【區別所在】

char *s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。

char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡不會改變,只有陣列的內容可以改變

【記憶體模型】

+-----+     +---+---+---+---+---+---+

s1: |  ******=> | h | e | l | l | o |\0 |

+-----+     +---+---+---+---+---+---+

+---+---+---+---+---+---+

s2: | h | e | l | l | o |\0 |

+---+---+---+---+---+---+

場景一)

char *s1 = "hello";

char s2 = "hello";

s2=s1;  //編譯error

s1=s2;  //ok

場景二)

char s2 = "hello";

char *s1 = s2;  //編譯器做了隱式的轉換 實際為&s2

或char *s1 = &s2;

分析:以上兩個指標復值完全等價,由於編譯器會做這個隱式轉換也容易導致初學者誤認為 char *s 與char s是一回事。

另用第二種在一些編譯器甚至會報警告資訊。

場景三)

char *s1 = "hello";

char s2 = "hello";

s1[0]='a';  //×執行error( 這一句好像在一些的編譯器不會出錯,原因待查)

s2[0]='a';  //ok

分析:執行時會報錯,原因在於企圖改變s1的內容,由於s1指向的是常量字串,其內容是不可修改的,因此在執行時不會通過。而s2指向的是變數區字串,可以修改。

場景四)

讓我們來給乙個指標的指標賦值,在使用某些含char**引數的函式時會用到,場景二的增強版。

char *s1="hello";

char s2="hello";

char *s3=s2;       //★注意這句必須要★

char **s4=&s3;   //s2(char)要用兩步才能完成賦值

char **s5=&s1;   //s1(char*) 只需一步

printf("s4=[%s]\n",*s4);//列印結果:s4=[hello]

printf("s5=[%s]\n",*s5);//列印結果:s5=[hello]

分析:這個例子應當說最能反映出char *與char 的差異,但是由於使用場合不多,新人尤其需要注意。

下面是一些char *s1 和 char s2相同的地方(同樣編譯器對char做了隱式變化):

1)作為形參完全相同

如:void function(char *s1);

void function(char s1);

2)只讀取不修改的時候

如:char *s1="hello";

char s2="hello";

printf("s1[1]=[%c]\n",s1[1]);   //s1[1]=[e]

printf("s2[1]=[%c]\n",s2[1]);   //s2[1]=[e]

printf("s1=[%s]\n",s1);         //s1=[hello]

printf("s2=[%s]\n",s2);         //s2=[hello]

char 和char 的區別

1 char是乙個陣列定義,char 是指標定義 也稱char為靜態陣列,char 為動態陣列 2 指標和陣列的區別 1 指標和陣列的分配 陣列是開闢一塊連續的記憶體空間,陣列本身的識別符號 也就是通常所說的陣列名 代表整個陣列,可以使用sizeof來獲得陣列所佔據記憶體空間的大小 注意,不是陣列元...

char 和char 的區別

char c abc c 0 t char c1 def c1 0 t err 首先c1是乙個指標,它只是指向 def 這個記憶體塊。而 abc 是乙個常量區,不可以對其進行更改。而c定義的是乙個陣列,在分配記憶體時,會自動給它分配四個位元組的位址,並且會進行乙份拷貝工作,此時分配是在棧區進行的,是...

char 和char 的區別

之前在用到char 和char,用到srtncat,讓char對char 進行新增時執行會崩潰,之後做了一些分析和練習,對char 和char有了更深的理解。下面附上一些測試資料。include include include using namespace std int main cout do...