輸出結果:
root@txp-virtual-machine:/home/txp# ./a.out
Segmentation fault (core dumped)
注解:這里會有段錯誤,錯誤出現在const+static修飾的j變量對其進行修改,還有const修飾的全局數組。
5、const修飾函數參數和返回值
const修飾函數參數表示在函數體內不希望改變參數的值
const修飾函數返回值表示返回值不可改變,多用于返回指針的情形
在c語言中的字符串字面量存儲于只讀存儲區中,在程序中需要使用const char* 指針,例如:
const char * s = "TXP嵌入式";//字符串字面量
代碼示例:
#include <stdio.h>
const char*fun(const int i)
{
i=8;
return "TXP";
}
int main()
{
const char * p=fun(0);
printf("%s",p);
p[1]='_';
printf("%s",p);
return 0;
}
輸出結果:
root@txp-virtual-machine:/home/txp# gcc test.c
test.c: In function ‘fun’:
test.c:5:4: error: assignment of read-only parameter ‘i’
i=8;
^
test.c: In function ‘main’:
test.c:12:5: error: assignment of read-only location ‘*(p + 1u)’
p[1]='_';
^
注解:上面這樣寫,肯定有問題。
代碼進化:
#include <stdio.h>
const char*fun(const int i)
{
// i=8;
return "TXP";
}
int main()
{
const char * p=fun(0);
printf("%s",p);
// p[1]='_';
// printf("%s",p);
return 0;
}
輸出結果:
root@txp-virtual-machine:/home/txp# ./a.out
TXP
二、volatile的用法
老實說,這個關鍵字在面試題目里面經常會出現,但是平時學習的時候,如果你沒有真正理解這其中的含義,在筆試的時候,腦袋里面可能依稀是記得有那么幾個結論,但是有時候吧,一緊張就把結論給忘了,也不是不可能,所以說,咋們還是老實一點,得真正把它原理搞明白才行,這樣上來戰場就不怕了,以后寫代碼也就少一點bug。
1、volatile的常用結論(volatile英文本意就是易變的意思)
這里我先給結論,然后再給一個例子,把這個例子的講明白,所有結論就都明白了。
volatile可理解為“編譯器警告指示字”
volatile告訴編譯器必須每次去內存中取變量值
volatile主要修飾可能被多個線程訪問的變量
volatile也可以修飾可能被未知因素更改的變量
volatile可以修飾一個中斷子程序中會訪問到的非自動變量
2、分析原理
大家可能平時在博客學習,都會發現講解編譯器優化的,然后加了volatile關鍵來修飾變量,就告訴編譯器不要去優化這個變量了,那么這里的優化到底是什么意思呢?
從字面上來理解優化兩個字,意思就是最優值(變量的值不會改變),這里我用一個簡單代碼來說明一下:
#include <stdio.h>
int main()
{
int a =1;//volatile int a =0;
while(a)
{
}
}
說明:上面的代碼,如果變量a沒有加volatile修飾的話,編譯器就會優化它(也就是a的值一直不變),所以while就一直死循環;然后我如果加了volatile來修飾的話,編譯器就不會去優化變量a,不優化的意思就是說,變量a的值可能就會改變,while就不會一直死循環。
當然這里為了好理解,我說的不是很專業,沒有從寄存器和內存的角度去說。(我也不想那么去講解,簡單理解了就行)
總之一句話:上面的結論中,volatile修飾的都是變量,變量就可能改變,不會被編譯器優化;只是說我們上面的結論應用場景不同而已。
三、總結
const使得變量具有只讀屬性
const不能定義真正意義上的常量
const將具有全局生命周期的變量存儲于只讀存儲區
volatile強制編譯器減少優化,必須每次從內存中取值
