char *a 與char a[] 的區別(一)

 

char *d = "hello word" 中的a是指向第一個字符‘a'的一個指針;char s[20] = "hello" 中數組名a也是執行數組第一個字符'h'的指針。現執行下列操作:strcat(d, s)。把字符串加到指針所指的字串上去,出現段錯誤,本質原因:*d="0123456789"存放在常量區,是無法修的。而數組是存放在棧中,是可以修改的。兩者區別如下:

讀寫能力:char *a = "abcd"此時"abcd"存放在常量區。**通過指針只可以訪問字符串常量,而不可以改變它**。而char a[20] = "abcd"; 此時 "abcd"存放在棧。可以通過指針去訪問和修改數組內容。

賦值時刻:char *a = "abcd"是在編譯時就確定了(因爲爲常量)。而char a[20] = "abcd"; 在運行時確定

存取效率:char *a = "abcd"; 存於靜態存儲區。在棧上的數組比指針所指向字符串快。因此慢,而char a[20] = "abcd"存於棧上,快。
另外注意:char a[] = "012345",雖然沒有指明字符串的長度,但是此時系統已經開好了,就是大小爲6-----`'0' '1' '2' '3' '4' '5' '\0'`,(注意strlen(a)是不計'\0')

舉例說明:

#include<stdio.h>
#include<string.h>

int main()
{
	char* a ="abcd";
	char *d = "hello word";
	char s[20] = "hello";
	char str2[] = "word";
	char b[] =  "012345";
	strcat(s,d); // d attach s
	printf("s=%s\n",s);

	*(a+2) = 'w'; //  core dump
	//*(str2+2)= 'w';
	//a[2] = 'w'; //only read
	str2[2] = 'w'; // can write

	printf("a=%s\n",a);
	printf("str2=%s\n",str2);

}

char* 表示數據可讀,數據存在靜態區;

char [] 表示數據可寫,數據存在棧區;

首先"abcd"是一個字符串常量,存儲在靜態數據區域(data段),這是在編譯時期就確定的。第一個是將字符串常量賦值給了一個變量(全局變量在數據段,局部變量在棧區),實際上是將字符串常量拷貝到了變量內存中,因此修改的只是str[]這個變量的值。

第二個是將字符串常量的首地址賦值給p,對p操作就是對字符串常量進行修改!因此出現了段錯誤


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章