分类: C/C++
2007-11-11 19:04:14
1、const修饰一个非指针变量时必须被初始化,(如果为指针变量则 const * 可以不被初始化,但是有warning;如果为 * const 则必须被初始化)
const int a =100 ;
结果:
1 变量a不能直接被修改。类似 a=101;这样的语句不能通过编译
2 取地址操作也需要加const 修饰符,
const int *b=&a ;
否则编译失败.失败信息:'initializing' : cannot convert from 'const int *__w64 ' to 'int *'。
3 引用操作符定义别名也需要加const修饰符,否则编译失败
const int &c=a ;
否则编译失败,失败信息: cannot convert from 'const int' to 'int &' d
2、首先是const配合指针的四个典型用法
int b = 500;
const int* a = &b; [1]
int const *a = &b; [2]
int* const a = &b; [3]
const int* const a = &b; [4]
1和2 一样 都表示指针指向常量,3表示常指针,4表示指向常量的常指针。
虽然1和2都表示指向常量,但是b不一定要为const,因此b可以修改。但是 (*a)不能修改。
3、const 放置于函数声明最后,如 const int * getnum() const;
说明该函数为函数为const成员函数,这个函数不能修改成员变量,也不能调用非const函数。
********************************************
void main()
{
int a[]={1,2,3,4,5,6},*p,k=3;
p=&k;
//在这之后我在书上看到过下面的表达式,不知道到底哪个对!
// p=a;
// p=&a; //error
// p=&a[0];
// *p=&a; //error
// *p=a; //error
// *p=&a[0]; //error
// **p=&a[0]; //error
*p=a[0]; //改变的是P指针所指的值K,此时K=1
int b=11;
int *c=&b;//
c = a; //c指针指向a首地址
}
int a[]={1,2,3,4,5,6},*p;
p=a;
p=&a[0];
//p=&a;//cannot convert from 'int (*)[6]' to 'int *'
//*p=&a;//cannot convert from 'int (*)[6]' to 'int'
//*p=a;//cannot convert from 'int [6]' to 'int'
//*p=&a[0];//cannot convert from 'int *' to 'int'
纯C中每个都可以能过编译,因为它们按左操作数的类型作了隐式转换,
C++中不行,只有两个是合法的。
a其实就是a[6]这个数组的首地址,也是a[0]这个数组元素的地址.所以a等价于&a[0].第一个和第三个将a数组的首地址赋给指针p,所以是正确的.