const的用法有四种:参数、返回值、函数,?另一种没有想起来
用const修饰变量将限定变量为只读,该变量值不允许被改变。下面是const用于定义数组大小的一个简单例子:
const int ArraySize = 10;
int array[ArraySize];//仅限于C++可以这样表示。
const变量必须初始化,这个一次性的初始化是设置其数值的唯一机会。
const int i; //错误,没有初始化
const也可以用于修饰指针。例如:
char chA = 'A';
const char chB = 'B';
char *const ptr_1 = &chA; //常指针
const char *ptr_2 = &chB; //指向常量的指针
char const *ptr_3 = &chB; //指向常量的指针
const char *const ptr_4 = &chB; //指向常量的常指针
当const与*并存时,正确区分的原则是:如果const位于*后,则指针本身是不能被修改的(常指针),至于指针所指向的变量,则可能允许被修改;如果const位于*前,则指针所指向的变量不能被修改的,即该指针是指向常量的指针,至于指针本身,则可能允许修改。而const与类型标识的位置关系则无关紧要,所以ptr_2和ptr_3是一样的。依据这一原则,很容易判断出下面的操作是否合法。
ptr_1 = &chB; //错误
*ptr_1 = chB; //正确
ptr_2 = &chA; //正确
*ptr_3 = chA; //错误
ptr_4 = &chA; //错误
*ptr_4 = chA; //错误
const也可以用于修饰引用,但不能用引用改变所指const变量的值。const定义常量对象的引用,可以用常量初始化,也可以用变量初始化。如果用变量初始化,则引用成为该变量的只读别名。也可以用常量表达式初始化const引用,但不可以用常量表达式初始化变量的引用。
const int i = 1;
int j = 2;
const int &m = i;
const int &n = j;
int &k = i + j; //错误
const int &p = i + j; //正确
定义本身为常量的引用变量是无意义的(虽然合法),因为所有引用变量自动成为常量(因为一量引用初始化,就不能引用其他变量)。
int n;
int &const k = n; //合法但没有意义
#include "stdio.h"
#define str1 "This is the first string!\n"
void main(void)
{
const char str2[] = "This is the second string!\n";
printf(str1); //为str1第一次分配内存
printf(str2); //为str2一次分配内存,以后不再分配
printf(str1); //为str1第二次分配内存
printf(str2); //不再为str2分配内存
}
所以使用const还可以节省内存空间。
#define T 13 /*用#define定义的一个常量T*/
int main()
{
const int t=13; /*用const定义的一个常量*/
int n=t; /*把t赋值给n*/
int m=T; /*把T赋值给m*/
}
区别:const常量有数据类型, 而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有类型
安全检查。而且字符替换可能会带来料想不到的边界效应。
有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。
1.差别:const与#define最大的差别在于:前者在堆栈分配了空间,而后者只是把具体数值直接传递到目标变量罢了,#define不占用内存单元,每次调用都会分配内存。
或者说,const的常量是一个Run-Time的概念,他在程序中确确实实的存在可以被调用、传递。而#define常量则是一个Compile-Time概念,它的生命周期止于编译期:在实际程序中他只是一个常数、一个命令中的参数,没有实际的存在。const常量存在于程序的数据段.#define常量存在于程序的代码段。
2优缺点:至于两者的优缺点,要看具体的情况了。
从执行效率上来说#define是一个更好的选择:
i.从run-time的角度来看,他在空间上和时间上都有很好优势。
ii.从compile-time的角度来看,类似m=t*10的代码不会被编译器优化,t*10的操作需要在run-time执行。而#define的常量会被合并。但是:如果你需要粗鲁的修改常数的值,那就的使用const了,因为后者在程序中没有实际的存在.另外在头文件中使用 #define 可以避免头文件重复包含的问题,这个功能,是const无法取代的
从执行稳健性来说用const会好一些:
在C语言中,还有用于定义常数的宏#define,它做是值代替(即文本代替),没有类型检查工具。而const提供了类型检查,可以避免值代替时容易出现的一些问题。安全检查。而且字符替换可能会带来料想不到的边界效应。 有些集成化工具可以对const常量进行调试, 但不能对宏量进行调试。所以C++中我们一般提倡用const,C语言就看情况使用了。
---------------------
作者:duola_rain
来源:CSDN
原文:https://blog.csdn.net/duola_rain/article/details/7829816?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!