C++中sizeof与const关键字会经常出错。
一、sizeof
在32位系统中下面各个sizeof的值是多少?
int *p = NULL;
sizeof(p)//值为4, 因为32位系统中的指针占4字节
sizeof(*p)//4, 因为此指针指向的是int类型
int a[100];
sizeof(a)//400, 数组大小
sizeof(a[100])//4, 访问元素, 相当于指针
sizeof(&a)//400, 数组别名
sizeof(&a[0])//4, 访问元素
int b[100];
void fun(int b[100])
{
sizeof(b);//4, 这里不再是整个数组的大小,b蜕变成一个指针
}
二、const
const修饰的值是常量,确切的说应该是只读的变量。其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。
当const修饰指针的时候,要注意一些情况,例如下面的情况:
const int *p;//p可变, p指向的对象不可变
int const *p;//p可变, p指向的对象不可变
int * const p;//p不可变, p指向的对象可变
const int *const p;//指针p和p所指向的对象都不可变
int const * p 和int * const p是一致的,所以只要看const右边的是什么就可以判断了
int const * p 中const右边是*p 所以p是一个指针常量
int* const p 中const右边是p,所以这个变量是常量,这个变量是指针,所以这个也是指针常量
const int* p 中const右边是int,所以这个整型是常量,所以说这个*p的值不能改变;
对于上面的东西很难记住,可以先忽略类型名,看const离哪一个近,离谁近就修饰谁
const int *p; //const修饰 *p, 所以p指向的对象不可变
int const *p; //const修饰 *p, 所以p指向的对象不可变
int * const p; //const修饰p, p不可变, p指向的对象可变
constint *const p; //前一个const修饰*p, 后一个修饰p, 所以p和*p都不可变
另外,const也可以修饰函数的参数。当不希望这个参数值在函数体内被意外改变时使用。例如:
void Fun(const int i)
这就告诉了编译器,在函数体中,i 不能被改变。
const还可以修饰函数的返回值,则返回值不能被修改,例如:
const int Fun(void)