constconst修飾型は次の文法を持ちます。
数学の言葉を使えば「定数」ということです。処理系によっては(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