(1)const的作用
1.定义const常量
int const a=10;
const int b=10;
2.便于进行类型检查
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
void f(const int i)
{
}//对传入的参数进行类型检查,不匹配进行提示
3.可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
void f(const int i)
{
i=10;//报错
}
4.为函数重载提供参考
class A
{
void f(int i){...}
void f(int i) const {...}//对上一个函数的重载
};
(2)const的使用
1.定义常量
int const a=1;或
const int a=1;
两者是一样的。类型描述符中如果有多个关键字,它们出现的位置不影响它对变量的限制。
2.作用在指针上
(1)指针本身不可变,但所指内容是可变的
(char*) const p;或
const (char*) p;
(2)指针可变,但所指内容不可变
const (char) *p;或
(char) const *p;
(3)两者都不可变
const char* const p;
(4)上述如何区别?
关键只有一句话:*的左边是指向类型,右侧是对变量的修饰。
(1)[] () *在数据定义时与在表达式中的优先级一样的理解。
int* a[10];//因为[]的优先级高于*,所以是一个数组,每个成员是一个指向整形的指针
int (*a)[10];//因为()的优先级高于[],所以先看里面,是一个指针,指向一个数组。
(2)对指针类型的判断是从右向左。
*的左边是指向类型,右侧是对变量的修饰。
const int* a;//*的左边是const int,即指向的数据不可修改。右边没有修饰符,为普通指针。
int* const a;//*的左边是int,指向的类型为int型的变量,即指向的数据可以被修改。*的右边是const,说明a指针是只读的。
int const* const a;//*右边要const,因此指针不可修改,*左边int const是指针指向的类型,仍然是不可修改的
如果const位于*的左侧,即指针指向的类型为常量。
如果const位于*的右侧,则const就是修饰指针本身,即指针本身是常量。
(3)函数中使用const
1.const修饰参数
(1)参数在函数体内不可改变。
void fun(const int a);//没什么意义,因为本身就是形参
(2)参数指针所指内容为常量,不可改变。
void fun(const char* p);
(3)参数指针本身为常量,不可改变。
(4)存储位置void fun(char* const p);//同样没有意义
typedef是自定义一种数据类型,要与define区分开,define是一种简单的替换。typedef void* VP;
const void* ptr;
const VP ptr;
char* strcpy(char* dest,const char* src)
char* strncpy(char* dest,const char* src,size_t n)