法大奥山研究室

 previous  contents

17.1. 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 内のポインタ strsconst 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

 previous  contents