您的位置:首页 > 编程语言 > C语言/C++

const用法补充

2014-12-04 10:44 134 查看
在ANSI C中,在符号前面加上const限定符表示这个符号不能被赋值,也就是它的值对于这个符号来说是只读的。

const int a;和int const a;的作用是一样的,都表示a是一个常整型数。由于a不能被赋值,它的值只能在声明是由初始化指定。如:const int a = 0;

如果试图通过赋值语句给该变量赋值,将产生编译警告:warning: assignment of read-only variable。

int main(int argc, char **argv)

{

       const int a = 0;

       int const b = 1;

       a = 2; //warning: assignment of read-only variable `a'

       b = 3; //warning: assignment of read-only variable `b'

}

由于指针是指向某个对象的。const和指针结合使用,可以有两层含义:(1)指针所指向的对象是可读的;(2)指针是可读的。在第一种情况下,指针不能用于修改这个对象,但是在任何时候,这个指针本身的值却可以改变。而第二种情况下,指针指向的对象是可以通过这个指针进行修改,但指针本身不可修改。

曾经看过有的编译器支持const int *cipvc const;的声明,但我在Redhat 8.0所带的gcc编译器中使用该声明将产生编译器错误:syntax error before "const"。

int main(int argc, char **argv)

{

       const int *cipvc const; //syntax error before "const"

       int const *icpvc const; //syntax error before "const"

}

在const int*a;中,a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。由于指针可重新赋值,可以在声明时指定初始化值,或者不指定。但是通过指针对指针所指向的整形数重新赋值将产生编译器错误:warning: assignment of read-only location。

int main(int argc, char **argv)

{

       int a = 0;

       int b = 1;

       int c = 2;

       int d = 3;

       int e = 4;

       int f = 5;

       const int *cip;

       int const *icp;

       const int *cipi = &a;

       int const *icpi = &b;

       cip = &a;  //pass

       icp = &b;  //pass

       cipi = &c; //pass

       icpi = &d; //pass

//     *cip = e;  //warning: assignment of read-only location

//     *icp = f;  //warning: assignment of read-only location

//     *cipi = e; //warning: assignment of read-only location

//     *icpi = f; //warning: assignment of read-only location

}

int *consta;是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。由于a是一个常指针,必须在声明时初始化,利用赋值语句赋值将产生编译器错误:assignment of read-only variable。但是可以对通过指针对指针所指向的整形数重新赋值。

int main(int argc, char **argv)

{

       int a = 0;

       int b = 1;

       int c = 2;

       int d = 3;

       int *const ipc;

       int *const ipci = &a;

       ipc = &b;  //assignment of read-only variable `ipc'

       ipci = &c;  //assignment of read-only variable `ipc'

       *ipci = d;  //pass

}

而在const int *const grape;中,a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。据此很容易理解下列编译错误。

int main(int argc, char **argv)

{

       int a = 0;

       int b = 1;

       int c = 2;

       int d = 3;

       const int *const cipc;

       const int *const cipci = &a;

//     cipc = &b; //assignment of read-only variable `cipc'

//     cipci = &c; //warning: assignment of read-only variable `cipci'

//     *cipci = d; //warning: assignment of read-only location

}

总之,如果const在*的左边,则指针指向的变量的数值不可变;如果const在*的右边,则指针指向的地址不可变。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  const c语言 经验