关于const的用法限制,可以用下面的一张表来表示
const int *p | int cont *p | int *const p | |||
申明时是否需要初始化 | 否 | 否 | 是 | 否 | |
是否可以指向常变量 | 是 | 是 | 否 | 是 | |
是否可以指向变量 | 是 | 是 | 是 | ||
是否可以重新指向 | 是 | 是 | 否 | ||
(*p)++ 是否可以进行 | 否 | 否 | 是 | ||
总结 | const修饰的是 *p,即p指向的单元的值,那个单元的值不能改变 | 它是否和const int *p等价? | const修饰的是p内存存放的内容,这个内容不能改变,因此说它不能重新指向别的地址 |
下面是测试代码支持
void TestConst()
{
const int a = 100;
const int c = 200;
int b = 1;
int d = 10;
// test1
const int *p1;
p1 = &a; // OK
// (*p1)++; // ERROR
p1 = &c; // OK
p1 = &b; // OK
b++; // OK
// (*p1)++;
cout<<*p1<<endl; // 2
// test2
// int *const ssss; // ERROR
// int * const p2 = &a; // ERROR
int * const p2 = &b; // OK
// p2 = &d; // ERROR
b++;
(*p2)++; //OK
cout<<*p2<<endl;
// test3
int const *p3 = &a; // OK
// int const *p3 = &b; // OK
p3 = &b; // OK
// (*p3)++; // ERROR
// test4
int const *p4 = &b;
// (*p4)++; // ERROR
b++;
cout<<*p4<<endl;
}
{
const int a = 100;
const int c = 200;
int b = 1;
int d = 10;
// test1
const int *p1;
p1 = &a; // OK
// (*p1)++; // ERROR
p1 = &c; // OK
p1 = &b; // OK
b++; // OK
// (*p1)++;
cout<<*p1<<endl; // 2
// test2
// int *const ssss; // ERROR
// int * const p2 = &a; // ERROR
int * const p2 = &b; // OK
// p2 = &d; // ERROR
b++;
(*p2)++; //OK
cout<<*p2<<endl;
// test3
int const *p3 = &a; // OK
// int const *p3 = &b; // OK
p3 = &b; // OK
// (*p3)++; // ERROR
// test4
int const *p4 = &b;
// (*p4)++; // ERROR
b++;
cout<<*p4<<endl;
}