之前自己寫代碼碰到 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]