目錄?
一、static關鍵字
二、const關鍵字
一、static關鍵字
在c語言中:
static是用來修飾變量和函數(shù)的
? ? ? ? 1.修飾局部變量——稱為靜態(tài)局部變量
? ? ? ? 2.修飾全局變量——稱為靜態(tài)全局變量
? ? ? ? 3.修飾函數(shù)——稱為靜態(tài)函數(shù)
有關內(nèi)存相關知識補充:程序的所有數(shù)據(jù),也就是所有的變量,都是存儲在內(nèi)存中的,而內(nèi)存中又可以分為棧區(qū)、堆區(qū)、靜態(tài)區(qū)。
?1.1 static修飾局部變量
作用:1.static修飾的局部變量改變了變量的生命周期
? ? ? ? ? ?2.讓靜態(tài)局部變量出了作用域依然存在,到程序結(jié)束,生命周期才結(jié)束
? ? ? ? ? ?3.改變變量的存儲類型(位置):棧區(qū)/堆區(qū)---->靜態(tài)區(qū)
代碼演示:
?由以上代碼可以看出,在沒有static修飾的時候每一次調(diào)用test函數(shù),函數(shù)中i的值都會重新賦值,而當i變量由static修飾的時候,在test結(jié)束之后并沒有被銷毀,下次調(diào)用test函數(shù)時i的值仍然是上次調(diào)用時i++的值。
可以看出,由static修飾的局部變量生命周期變長了。
1.2 static修飾的全局變量
作用:如果一個全局變量被static修飾,那這個全局變量就只能在本源文件中使用,不能在其他源文件內(nèi)使用。
代碼演示:
//代碼1
//lin.c
int bite_lin=20;
//test.c
extern bite_lin;//外部符號聲明
int main()
{
printf("%d\n",bite_lin);
return 0;
}
//代碼2
//lin.c
static int bite_lin=20;
//test.c
extern bite_lin;
int main()
{
printf("%d", bite_lin);
return 0;
}
可以看出:static修飾的全局變量改變了這個全局變量的鏈接屬性,使得這個全局變量由外部變量轉(zhuǎn)變成內(nèi)部變量,這個靜態(tài)變量只能在自己的源文件內(nèi)部使用,而不能在其他源文件內(nèi)部使用。(簡要的說:限制了使用范圍,讓人感覺作用域變小了)?
1.3 static修飾的函數(shù)
作用:static修飾的函數(shù)和修飾的全局變量類似,限制了函數(shù)的使用范圍,使得該函數(shù)只能在本源文件中使用,而不能在其他源文件中使用。
代碼演示:
//代碼1
//add.c
Add(int x, int y)
{
return x + y;
}
//test.c
extern Add(int x,int y);//外部函數(shù)聲明
int main()
{
printf("%d", Add(2, 3));
return 0;
}
//代碼2
//add.c
static Add(int x, int y)
{
return x + y;
}
test.c
extern Add(int x,int y);//外部函數(shù)聲明
int main()
{
printf("%d", Add(2, 3));
return 0;
}
?可以看出,跟static修飾的全局變量一樣,static修飾的函數(shù)使用范圍被限制了。
二、const關鍵字
2.1 const修飾常變量
const修飾的常變量具有常量的特性,不能被修改,但本身還是個變量。
例:
?這樣子直接修改編譯器會報錯,是因為const修飾的常量是不能被直接修改的。
例:
這里報錯是因為表示數(shù)組的元素個數(shù)必須是常量而不能是變量,這也作證了const修飾的變量本質(zhì)上還是個變量。(注:在C++或者在其他比較新的C語言的標志中,const修飾的變量也可以用于表示數(shù)組的元素個數(shù))?
2.2 const修飾指針
可以看出,當遇到變量被const修飾時候,還可以通過指針的方式修改num的值,那么如果指針加上const會變得怎么樣呢?
例:
1.當const放在*的左邊的時候,修飾的是指針指向的內(nèi)容,保證指針指向的內(nèi)容不能通過指針來改變。(這里的左邊,也可以是這樣子放:int const* p,只要保證是*左邊就可以)
但是指針變量本身的內(nèi)容是可以改變的,例如:
?
2.const如果放在*的右邊的時候,修飾的是指針變量的本身,也就是所指向內(nèi)容的地址。
保證了指針變量的內(nèi)容不能修改,但是指針指向的內(nèi)容可以通過指針改變。
例如:
?2.3 const修飾函數(shù)
用const修飾函數(shù),主要是防止在傳參的時候,在被傳入的函數(shù)中傳入的參數(shù)被修改。
1.“值傳遞”
代碼演示:
形參被const修飾,那在此函數(shù)中的n就不能再被修改,如果修改將會報錯。?
2.“指針傳遞”
代碼演示:
?指針傳遞也是如此,當形參被const修飾的時候,在該函數(shù)中這給指針就不能被修改。
2.4 const修飾指針以及函數(shù)中的具體運用
我們在編寫函數(shù)的過程中,如果要寫出優(yōu)秀的代碼,那么在編寫函數(shù)的過程中就要盡量的使用const修飾,這樣可以避免當我們想要傳入的參數(shù)不被修改時而不小心被修改導致bug的出現(xiàn),增加了代碼的可用性以及目的性。
以庫函數(shù)中strcpy為例子,模擬此函數(shù):
void my_strcpy(char* dest,const char* src)
{
?? ?while (*dest++=*src++)
?? ?{
?? ??? ?;
?? ?}
}
int main()
{
?? ?char arr1[20] = "xxxxxxxxxxxxxxx";
?? ?char arr2[] = "hello lin";?? ?my_strcpy(arr1, arr2);
?? ?printf("%s\n", arr1);
?? ?return 0;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-734621.html
?因為我們這里的src是不想要被改變的,調(diào)用該函數(shù)的時候我們只是需要讓該函數(shù)把scr的字符串拷貝到dest的字符串,為了防止在該函數(shù)中該字符串內(nèi)容被改變導致出現(xiàn)bug,我們就可以用const去修飾該形參。文章來源地址http://www.zghlxwxcb.cn/news/detail-734621.html
到了這里,關于詳解const、static關鍵字的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!