char s[] 和 char *s 的區別


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

原文地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM