C语言06 const详解+const 和define的区别

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值