1、C语言的关键字const的含义和用途。
含义:const是只读的意思,被const修饰的东西都受到强制保护,只允许访问不允许被改变,可以预防意外的变动,能提高程序的健壮性。
通过给编译器特定的附加信息,可以使编译器保护那些不希望被改变的参数,防止其被无意的代码修改。
用途:
(1)可以定义 const 常量。
(2)可以修饰指针。
(3)可以修饰函数的参数、返回值,甚至函数的定义体。
2、const 用法:限定变量和指针
(1)const int a;
(2)int const a; //似ROM
1和2作用一样,a为常整型数。限定a数据成员只能被访问不能被修改。即a不可变。
(3)const int *a;
(4)int const *a;
3和4作用一样,限定a的指向,a只能指向常整型。
a可变,可以指向不同的常整数;但是被a指定的内容*a是常整型,不可变的。
即a本身可变,但*a不可变;
const int b=5, c=6;
a = &b;
a = &c;
const char *name=“chen”;
name[3]=‘a’; //错误
name=“zhang”; //正确
(5)int* const a;
限定a为指向整数的常指针,即指针的指向不能修改。
a不可变,但是*a可变;
int b = 6;
int *const a = &b;
b = 7;
printf("*a = %d", *a); //输出 *a = 7
char *const name=“chen”;
name[3]=‘a’; //正确
name=“zhang”; //错误——改变了首地址
(6)int const * const a;
限定a为指向一个常整数的常指针,即a不可变,*a也不可变。
const int b=5;
a = &b;
========
@助记方法:把一个声明从右向左读。
(const int) a;
(int const) a;
(const int) (*a);
(int const) (*a);
(int*) (const a);
(int const *) (const a);
3、const 限定函数参数
void function(const int Var);
传递过来的参数在函数内不可以改变.
4、const 限定函数返回值型.
const int function(); //此时const无意义
5、const的实际运用:
以下代码有什么问题?
(1)
{
char* s="AAA";
printf("%s", s);
s[0]='B';
printf("%s",s);
}
答: "AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。
cosnt char* s="AAA";
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。
(2)
{
char s[10]="AAA";
printf("%s", s);
s[0]='B';
printf("%s",s);
}
答:s[10] 表示为非常量,可以进行修改,合法。
@区别char *p ="AAA";和 char p[ ] ="AAA";
(3)
{
char s[3]="AAA";
printf("%s", s);
}
答:语法上合法,但是有隐患,数组没有通常终止的'\0'字符。因此该数组不是一个真正的C字符串,从而不能用在strcpy和printf等语句中。
多数情况下,应该让编译器计算数组初始化的初始化个数,在初始值“abc”中,计算得到的长度。
char b[] = "abc";
printf("b[]= %s\n", b);
(4)
{
typedef char* pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
}
答:*p1作为整体不能被修改,但p1可以修改,p1++合法。
printf("p1 = %s", p1);输出: bc
p2作为一个整体,不能被修改,p2++修改非法。
const pStr p2;等同于pStr const p2;就像 const int p2;等同于int const p2;这样p2就是指向整型的常指针。所以p2是不能修改的。
===========const 修饰符和 define的区别===============
【1】3类 有关标志
#define LIMIT 100 //这里 LIMIT 是一个标志,代表100。
const int LIMIT=100; //这里LIMIT 是一个常量名,在内存有空间放了100,因此有地址,可以用指针指向这个空间,但不能修改它。
int i=100; //这里i是一个变量名,在内存有空间放了100,因此有地址,可以用指针指向这个空间,而且可以改放别的整数。
【2】在定义常量时,为什么推荐使用const,而不是#define?
C中常用:#define 变量名 变量值 定义一个值替代。
它有个致命缺点:在预处理阶段缺缺乏类型检测机制,这样预处理可能引发错误的隐患,const却没这个问题。
【3】区别的例子
int a =1;
#define T1 a+a
#define T2 T1-T1
cout<<"T2 is "<<T2<<endl; //a+a-a+a=a+a
T2 is 2;
int a =1;
int const T1=a+a;
int const T2=T1-T1;
cout<<"T2 is "<<T2<<endl;
T2 is 0;