第9課constとvolatile分析
2489 ワード
const読取り専用変数・const修飾の変数は読取り専用で、本質か変数・const修飾の局所変数かスタックに空間を割り当てる・const修飾のグローバル変数はグローバルデータ領域に空間を割り当てる・constはコンパイル期間にのみ有用であり、実行期間には無用である
const修飾変数は本物の変数ではありません.コンパイラに変数が付与記号の左側に現れないことを伝えるだけです.
constグローバル変数の相違点注意:標準C言語コンパイラはconst修飾のグローバル変数を読み取り専用ストレージ領域に格納するのではなく、変更可能なグローバルデータ領域に格納し、その値は変更できます.読み取り専用ストレージ領域に格納するとエラーが表示されます.
constの変数の本質例9-1:
include "stdio.h"
const int g_cc = 2;int main(){
}出力結果:13 g_cc = 2
出力結果はコンパイラによって出力され,const変数付与アドレスの出力はコンパイラによって異なる.
constの本質:・C言語のconstは変数に読み取り専用属性を持たせる・現代のC言語コンパイラのconstはグローバルライフサイクルを持つ変数を読み取り専用ストレージに格納するconstは本当の意味での定数を定義できない.
例9-2:
include"stdio.h"
const int g_array[5] = {0};
void modify(int*p,int v){
}int main(){
}出力結果:i=1 j=0 array[0]=3 g_array[0] = 0
const修飾関数パラメータと戻り値・const修飾の関数パラメータは、関数内でパラメータを変更することを望まない値を表す・const修飾関数戻り値は、戻り値が変更不可であることを示す、戻りポインタに多く用いられる場合const修飾関数パラメータと戻り値9-3.c
include "stdio.h"
const char*f(const int i){//i=5;//iはconstで修飾されているため、iは定数であり、左の値はできない
}int main(){
}出力結果:エラー
・volatileは「コンパイラ警告指示字」と理解できる・volatileはコンパイラにメモリから変数値を除去する必要があることを伝える・volatileは主に複数のスレッドにアクセス可能な変数を修飾する・volatileは未知数に変更される可能性がある変数を修飾する
読み取り専用のintタイプの変数を定義し、コンパイラは最適化せずにメモリから値を取ります.
小結:・const変数は読み取り専用属性を持つ・constは本当の意味での定数を定義できない・constはグローバルライフサイクルを持つ変数を読み取り専用記憶領域に格納する・volatile強制コンパイラは最適化を減らし、メモリから値を取るたびにディテソフトウェア学院の授業ノートを取らなければならない
const修飾変数は本物の変数ではありません.コンパイラに変数が付与記号の左側に現れないことを伝えるだけです.
constグローバル変数の相違点注意:標準C言語コンパイラはconst修飾のグローバル変数を読み取り専用ストレージ領域に格納するのではなく、変更可能なグローバルデータ領域に格納し、その値は変更できます.読み取り専用ストレージ領域に格納するとエラーが表示されます.
constの変数の本質例9-1:
include "stdio.h"
const int g_cc = 2;int main(){
const int cc = 1;
int *p = (int)&cc;
printf("%d
",cc);
*p = 3;
printf("%d
", cc);
printf("g_cc = %d
", g_cc);
p = (int*)&g_cc;
*p = 4;
printf("g_cc = %d
", g_cc);
return 0;
}出力結果:13 g_cc = 2
出力結果はコンパイラによって出力され,const変数付与アドレスの出力はコンパイラによって異なる.
constの本質:・C言語のconstは変数に読み取り専用属性を持たせる・現代のC言語コンパイラのconstはグローバルライフサイクルを持つ変数を読み取り専用ストレージに格納するconstは本当の意味での定数を定義できない.
例9-2:
include"stdio.h"
const int g_array[5] = {0};
void modify(int*p,int v){
*p = v;
}int main(){
const int i = 0; //const int
const static int j = 0; // j , static , , const
int const array[5] = { 0 };
modify((int *)&i, 1); //ok
//modify((int *)&j, 2); //error
modify((int *)&array[0], 3); //ok
//modify((int *)&g_array[0], 4);//error
printf("i = %d
",i);
printf("j = %d
", j);
printf("array[0] = %d
", array[0]);
printf("g_array[0] = %d
", g_array[0]);
}出力結果:i=1 j=0 array[0]=3 g_array[0] = 0
const修飾関数パラメータと戻り値・const修飾の関数パラメータは、関数内でパラメータを変更することを望まない値を表す・const修飾関数戻り値は、戻り値が変更不可であることを示す、戻りポインタに多く用いられる場合const修飾関数パラメータと戻り値9-3.c
include "stdio.h"
const char*f(const int i){//i=5;//iはconstで修飾されているため、iは定数であり、左の値はできない
return "zhangyingli";
}int main(){
const char *pc = f(0); // f const char , const char
printf("%s
",pc);
pc[6] = '_'; //error *pc const
printf("%s
",pc);
return 0;
}出力結果:エラー
・volatileは「コンパイラ警告指示字」と理解できる・volatileはコンパイラにメモリから変数値を除去する必要があることを伝える・volatileは主に複数のスレッドにアクセス可能な変数を修飾する・volatileは未知数に変更される可能性がある変数を修飾する
読み取り専用のintタイプの変数を定義し、コンパイラは最適化せずにメモリから値を取ります.
小結:・const変数は読み取り専用属性を持つ・constは本当の意味での定数を定義できない・constはグローバルライフサイクルを持つ変数を読み取り専用記憶領域に格納する・volatile強制コンパイラは最適化を減らし、メモリから値を取るたびにディテソフトウェア学院の授業ノートを取らなければならない