在c語言中,指針和數組名都表示地址,但兩者卻有很大的不同之處,對於初學者來說一定要弄清楚兩者的區別。
首先,我舉個簡單的例子:
char *p1="hello!"; //定義字符型指針p1,並將指針p1指向字符串“hello!”的首地址。
char s[10]="hello!"; //定義數組s,並將其初始化賦值。
然而,如果char s[10]; s="hello!";這樣就會報錯,為什么呢?原因很簡單,因為數組名是常量。
言歸正傳,我現在舉兩個簡單的例子:
例子1
void main()
{
char p[]="abcdef";
p[0]='Y';
printf("%s",p);
}
在本段程序中輸出Ybcdef
例子2
void main()
{
char *p="abcdef";
p[0]='Y';
printf("%s",p);
}
本段程序卻拋出異常,為什么?
在例子2中,char *p="abcdef",指針p是存儲在堆棧區,但字符串是常量,存儲在常量區,只是指針p指向了存儲在常量區的字符串首地址,此時不能改變常量區的字符串的值。
在例子1中,char p[]="abcdef",此處的賦值是將常量區的字符串“abcdef”拷貝到了堆棧區的數組p的空間了。數組p是在堆棧區開辟了空間,此時是可以修改字符串的值,因為修改的是堆棧區的字符串的值。另外此時的數組名p是堆棧區中的”abcdef“的首地址。
