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 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在*的右边,则指针指向的地址不可变。
相关文章推荐
- C++中的const用法
- C++(typedef、一维数组转成二维数组、C和C++区别、成员地址成员指针、构造析构函数、this指针、const用法、显示时间、const用法)
- const 用法小结
- const和extern用法
- C/C++中的const和const指针的基本用法
- const 用法简单总结
- const的用法总结
- C语言----const的用法
- const的常见用法
- const 的用法及解释
- c/c++中const用法总结
- C++中const用法总结
- 常量指针与指针常量(const用法)
- 第16周 范型程序补充之set用法
- const 的用法(全面得一匹)
- static_cast、dynamic_cast reinterpret_cast和const_cast用法
- CONST的用法小结:
- const用法+自己的理解
- C++中const、volatile、mutable的用法
- C++中const用法解释(最全)