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 是陣列對應著一塊記憶體區域,其位址和容量在生命期裡...