トップC-Tips > const修飾子

const修飾子

例えば、"12.3" のように文字列で表した数値を double型に変換する atof関数のプロトタイプ宣言は stdlib.h に次のように定義されている。

double      atof (const char *s);

この引数の宣言で使われている const は何を意味するのか? (stdlib.hでは引数名sは省略されている。プロトタイプ宣言では引数名を付けても、付けなくてもよいが、 ここでは説明の都合上、引数名を付けている。) 別の例として、文字列を区切り文字で分解する strtok関数は string.h に次のように宣言されている。 第2引数 s2 にだけ、const修飾子が付けられている。

 char *strtok(char *s1, const char *s2);

const修飾子の付いた文字列(文字配列)s、s2 は atofとか strtok の関数内部で書き換えられることはないことを表している。 一方、const演算子が付いていない文字列(文字配列)s1 は strtok関数内部で書き換えられる可能性がある ことを表している。 例えば、次のプログラム

#include <stdio.h>
#include <string.h>

int main() {
    int n;
    char str[] = "ab;12;xy";
    char *p = strtok(str, ";");	  // ; を区切り文字にする
    while (p != NULL){
        puts(p);
        p = strtok(NULL, ";");
    }
    for (n = 0; n < 9; n++) printf("%c", str[n]);
    printf("\n");
    for (n = 0; n < 9; n++) printf("%d,", str[n]);
}
を、コンパイル・実行すると、以下の結果が得られる。
c:\MH\www\c-tips\c>const01
ab
12
xy
ab 12 xy
97,98,0,49,50,0,120,121,0,

文字配列 str の中身は最初 "ab;12;xy" であるが、strtok関数を実行した結果、 ';' のところが '\0'(ASCIIコード 0) に置き換えられている。