const
const修飾型は次の文法を持ちます。
数学の言葉を使えば「定数」ということです。処理系によっては(volatile
を付さない)const修飾型は読み込み専用の記憶域領域(read-only region of storage)に割り当てられることがあります。
/* Example 17.1 * * コンパイルエラーとなる例 * * pi を 3.14159 に変更不可能としたにもかかわらず,x と y の和を代入。 * */ int main(void) { double x = 1.0, y = 2.0; const double pi = 3.14159; pi = x + y; return 0; }
この例は const修飾型オブジェクト pi
を単純代入演算子の左側オペランドに指定したため,コンパイルエラーとなります。
/* Example 17.2 */ #include <stdio.h> // printf #include <string.h> // strncat, strncpy, strlen void myPrint(const char *, size_t); int main (void) { char str[8] = "ABCDE"; char x[16] = "0123"; myPrint(x, sizeof(x)); strncat(x, str, sizeof(x) - strlen(x) - 1); myPrint(x, sizeof(x)); strncpy(x, str, sizeof(x) - 1); myPrint(x, sizeof(x)); return 0; } void myPrint(const char *str, size_t size) { const char *s; printf("str: SIZE = %zd, LENGTH = %zd\n", size, strlen(str)); for(s = str; *s != '\0'; s++) printf("[%p]\tx[%td]\t%c\t(%d)\t%s\n", s, s - str, *s, *s, s); }
この例はポインタに const
を利用したケースです。関数 myPrint
内で受け取った配列 str
が変更できないようにします。関数 myPrint
内のポインタ str
や s
は const char
へのポインタであり,ポインタ自体は const修飾型ではありません。(ソース内のその他は既出です。)
実行結果です。
str: SIZE = 16, LENGTH = 4 [0xbffffa88] x[0] 0 (48) 0123 [0xbffffa89] x[1] 1 (49) 123 [0xbffffa8a] x[2] 2 (50) 23 [0xbffffa8b] x[3] 3 (51) 3 str: SIZE = 16, LENGTH = 9 [0xbffffa88] x[0] 0 (48) 0123ABCDE [0xbffffa89] x[1] 1 (49) 123ABCDE [0xbffffa8a] x[2] 2 (50) 23ABCDE [0xbffffa8b] x[3] 3 (51) 3ABCDE [0xbffffa8c] x[4] A (65) ABCDE [0xbffffa8d] x[5] B (66) BCDE [0xbffffa8e] x[6] C (67) CDE [0xbffffa8f] x[7] D (68) DE [0xbffffa90] x[8] E (69) E str: SIZE = 16, LENGTH = 5 [0xbffffa88] x[0] A (65) ABCDE [0xbffffa89] x[1] B (66) BCDE [0xbffffa8a] x[2] C (67) CDE [0xbffffa8b] x[3] D (68) DE [0xbffffa8c] x[4] E (69) E