標(biāo)簽(空格分隔): C語言
在C語言
中有內(nèi)存四區(qū)
的概念,分別是常量區(qū)
,代碼區(qū)
,堆區(qū)
,棧區(qū)
。
在常量區(qū)
中的內(nèi)存數(shù)據(jù)是不能改變的,否則將會(huì)發(fā)生不可預(yù)知的錯(cuò)誤。
下面我來看一個(gè)明顯的例子:
我們有一個(gè)字符串反轉(zhuǎn)函數(shù)。
int reverse(char *str)
{
if (str == NULL)
{
return -1;
}
int length = strlen(str);
char *p1 = str;
char *p2 = str + length - 1;
while (p1<p2)
{
char c = *p1;
*p1 = *p2;
*p2 = c;
p1++;
p2--;
}
return 0;
}
測(cè)試函數(shù):
int main()
{
char buf[] = "abcderf";
reverse(buf);
printf("after revers str = %s\n", buf);
}
上面的函數(shù)測(cè)試是通過的
測(cè)試函數(shù)2:
int main()
{
char* buf = "abcderf";
reverse2(buf);
printf("after revers str = %s\n", buf);
}
上面的函數(shù)測(cè)試時(shí)無法通過的
總結(jié)原因:
使用數(shù)組存放字符串時(shí),有兩個(gè)地方分配內(nèi)存,一個(gè)是常量區(qū)
,一個(gè)是棧區(qū)
.
使用指針指向字符串時(shí),棧區(qū)
中只是分配了指針變量
的存儲(chǔ)空間,常量區(qū)
中存放字符常量
使用數(shù)組的時(shí),操作的是棧區(qū)
的內(nèi)存空間,使用指針的時(shí),操作的是常量區(qū)
的內(nèi)存空間。
數(shù)組和指針還有一些差異:
- 數(shù)組做函數(shù)參數(shù),退化成指針。因此當(dāng)我們?cè)趯?shù)組作為參數(shù)傳遞進(jìn)函數(shù)的時(shí),在一般情況下,我們有必要將這個(gè)數(shù)組的大小傳遞給函數(shù)。
- 調(diào)用sizeof運(yùn)算時(shí),如果參數(shù)是指針,則得出指針變量的內(nèi)存大小,如果是數(shù)組,則得出數(shù)組的空間.
- 數(shù)組在定義時(shí),就需要初始化,而且數(shù)組不能被重新指向,數(shù)組一般不能被malloc,指針空間可以.