char s 和 char s 的區別

2021-08-19 21:17:55 字數 2656 閱讀 8099

char *d = "hello" 中的a是指向第乙個字元『a'的乙個指標;char s[20] = "hello" 中陣列名a也是執行陣列第乙個字元'h'的指標。現執行下列操作:strcat(d, s)。把字串加到指標所指的字串上去,出現段錯誤,本質原因:*d="0123456789"存放在常量區,是無法修的。而陣列是存放在棧中,是可以修改的。兩者區別如下:

(1)讀寫能力:char *a = "abcd"此時"abcd"存放在常量區。通過指標只可以訪問字串常量,而不可以改變它。而char a[20] = "abcd"; 此時 "abcd"存放在棧。可以通過指標去訪問和修改陣列內容。

(2)賦值時刻:char *a = "abcd"是在編譯時就確定了(因為為常量)。而char a[20] = "abcd"; 在執行時確定.

(3)訪問效率:char *a = "abcd"; 存於靜態儲存區。在棧上的陣列比指標所指向字串快。因此慢,而char a[20] = "abcd"存於棧上,快。

另外注意:char a = "01234",雖然沒有指明字串的長度,但是此時系統已經開好了,就是大小為6-----'0' '1' '2' '3' '4' '5' '\0',(注意strlen(a)是不計'\0')

之前自己寫**碰到 char s;和char *s 的各種方面總是搞不清楚,知道他們是不一樣的,但因為將他們列印出來有都是 相同的位址所以一直懵逼,今天特地網上整理了下,將他們徹底搞定

不同點:

1.在宣告時

char *s1="hello";//宣告乙個指標指向常量"hello"

char s2="hello";//在棧中開闢乙個陣列字元"hello";

/** s2="hello" 相當於

* char s2[6];

* s2[0]='h';

* s2[1]='e';

* s2[2]='l';

* s2[3]='l';

* s2[4]='0';

* s2[5]='\0';

**/

說明:

s1內容不能修改,因為他指向常量

s2內容可以修改,因為他指代記憶體中的變數區

s2其位址和容量在生命期裡不能改變

2.使用時

char str[255];//宣告乙個字元陣列str佔255個位元組

char *p;//宣告乙個字串指標p

char *sp;//宣告乙個字串指標sp

sp = str;/**實際上是 sp=&str; 編譯器做過處理**/

//需要有乙個指標來儲存原先位址

p=sp;

*(sp++)='1';

*(sp++)='2';

*sp++='3';//相當於*(sp++)

*sp++='4';

*sp++='5';

*sp='\0';

printf("%s\n",p);

printf("%p\n",p);

printf("%p\n",&str);

printf("%p\n",sp-5);

printf("%s\n",(sp-5));

//等同於*********************************************==

int i=0;

char str[255];//宣告乙個字元陣列str佔255個位元組

char *p;//宣告乙個字串指標p

p=str;

str[i++]='1';

str[i++]='2';

str[i++]='3';

str[i++]='4';

str[i++]='5';

str[i]='\0';

printf("%s\n",p);

printf("%p\n",p);

說明:

char str 實際是乙個(字元陣列)指標,不是(字元)指標 

char str 不是乙個真實意義(宣告的)的指標型別,不能進行正常指標的加減計算操作

char *p是乙個指標型別可以進行計算操作

相同點:

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 s 和 char s 的區別

最近的專案中有不少c的程式,在與專案新成員的交流中發現,普遍對於char s1 和 char char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的...

char s和char s 的區別

char str1 hello char str2 hello 我們說這個是定義而不是宣告,是因為定義在記憶體裡面分配了房子。而宣告,只給了個房產證卻不給你分房子。str1 是 char 型別 它是乙個指標,這個指標指向乙個字串。str2 是 char 型別。它是乙個陣列,他代表了這堆記憶體空間。h...

char s 和 char s 的區別小結

char s1 hello char s2 hello 區別所在 char s1 的s1,而指標是指向一塊記憶體區域,它指向的記憶體區域的大小可以隨時改變,而且當指標指向常量字串時,它的內容是不可以被修改的,否則在執行時會報錯。char s2的s2 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...