字串字面常數的特殊性

字串是把一連串字元輸入到字元陣列中,一般有兩種方式可以放到陣列當中,例如char strA[ ]="year";,以及strB[ ]={'y','e','a','r','\0'};。
而讚printf("%s",strA)這邊的雙引號""是可以隱性的轉成指標,也就是可以用printf(strA)來撰寫,其列印內容是相同的。
【printf("%s",strA) == printf(strA)】
而用雙引號括號出的字串字面常數是一個很特別的東西【printf("hello")】,它可以直接的轉性為字元的指標【char *strC="hello"】。

字串字面常數就是雙引號所括號出的表示法【printf("hello C")】。
1.可作為字元陣列的初始化。char strA="test";(有自訂義已知空間儲存)
    其陣列內容可以存取修改(不可以整串一起修改,只能一個一個空間存取修改)。
2.可直接的轉型成字元的指標。char *strA="test";(有記憶體位址但儲存在記憶體唯讀空間)
    只可以讀取不可以修改char strA[0]='T'(修改為未定義行為-編譯可能會過,但會有不可預期的行為)。
   但是可以整串一起修改strA="TESR",它也是記憶體自動分配的唯讀空間(另外重新分配唯讀空間)

#include<stdio.h>
#include<string.h>
int main(){
char strA[]="hello";
char strB[]={'h','e','l','l','o','\0'};
printf(strA);//隱性轉成指標(指標位址為strA[0],且將其陣列整個列印出來)
printf("\n%s\n",strB);

char *strC="test";//編譯器隱性轉型為字元指標(唯讀空間)
//不可以strC[0]='T';此為未定義行為(唯讀空間)
printf("%s\n",strC);
strC="TEST";//可以整串一起換掉
printf("%s\n",strC);
return 0;
}

留言