C语言const的应用举例

一、常规用法
关键字const用来定义只读变量,被const定义的变量它的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量,这也就意味着必须在定义的时候就给它赋初值。
用const修饰变量的格式通常为
1 const type name = value;
代码示例;(第一种方式)
1 const int Max;
也可以写成下面这种(第二种方式)
1 int const Max;
通常情况下使用第一种方式(建议将被const修饰的变量的首字母大写),被 const 修饰的变量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。

二、const与指针
const与指针配合使用有两种作用,一是限制指针变量,二是限制指针变量指向的数据
限制指针变量本身
1 int * const p2;//const修饰的是指针变量
限制指针变量本身的意思是,指针变量本身的值不能被修改,所以被 const 修饰的指针变量指针只能在定义时初始化,不能定义之后再赋值,错误代码如下

int main(void)
{
	int	 p1[5] = {1,2,3,4,5};
	int  *const  p2;
	p2 = p1;
}

**限制指针变量指向的数据
1 const int p1;
2 int const p1;
上面两种写法都可以,一般使用第一种,限制指针变量指向的数据的意思就是指针可以指向不同的变量(指针本身的值可以修改),但是不能用指针修改指针指向的数据的值,错误代码如下

int main(void)
{
	int	 p1 = 5;
	Const  int  *  p2;
	p2 = &p1;
	(*p2)++;
}

区分const是限制的指针变量还是指针变量指向数据的值:const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。
当然也可以同时限制指针变量和指针变量指向的数据的值,写法如下

1 const int * const p2;

上面这种写法使指针变量和指针变量指向数据的值都不能修改

三、const和函数形参
在很多情况下,const修饰的变量完全可以使用 #define命令代替,const 通常用在函数形参中,在C标准库中有很多函数形参都用const限制了,为了防止在函数内部修改指针指向的数据,例如 fopen_s

四、const和非const类型的转换
当一个指针变量 str1 被 const 限制时,并且类似const char *str1这种形式,说明指针指向的数据不能被修改;如果将 str1 赋值给另外一个未被 const 修饰的指针变量 str2,就有可能发生危险。
因为通过 str1 不能修改数据,而赋值后通过 str2 能够修改数据了,意义发生了转变,所以编译器不提倡这种行为,会给出错误或警告,也就是说,const char *和char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。这种限制很容易理解,char *指向的数据有读取和写入权限,而const char *指向的数据只有读取权限,降低数据的权限不会带来任何问题,但提升数据的权限就有可能发生危险。

五、const与#define
1、define是预编译指令,而const是普通变量的定义。define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。

2、const定义的是变量,而define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。但const定义的常变量本质上仍然是一个变量,
具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,
用const定义的常变量具有宏的优点,而且使用更方便。所以编程时在使用const和define都可以的情况下尽量使用常变量来取代宏,但有些情况下const常变量是无法代替define宏的下面会举例。

3、const定义的是变量,而宏定义的是常量,所以const定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,
没有类型安全检查。这样就很容易出问题,即“边际问题”或者说是“括号问题”。

六、补充
如果要定义数组的最大长度,这个时候就不能用const,const定义的常变量,终究是一个变量,不能作为数组的长度,示例代码如下

#include “stdio.h”

	Const int MAX = 10;
	int main(void)
	{
	int p1[max] = {0};
	return 0;
}

七、顺便区别下C99标准下的变长数组
ANSI C 标准规定:定义一个数组时,数组的长度必须是一个常数,即数组的长度在编译的时候是确定的。在ANSI C 中定义一个数组的方法如下:

int  a[10];

C99 新标准规定:可以定义一个变长数组。

int len;
int a[len];

也就是说,数组的长度在编译时是未确定的,在程序运行的时候才确定,甚至可以由用户指定大小。
比如,我们可以定义一个数组,然后在程序运行时才指定这个数组的大小,还可以通过输入数据来初始化数组,示例代码如下。

int main(void)
{
    int len;
    printf("input array len:");
    scanf("%d", &len);
    int a[len];
    for(int i = 0; i < len; i++)
    {
        printf("a[%d]= " ,i);
        scanf("%d", &a[i]);
    }
      printf("a array print:\n");
    for(int i = 0; i < len; i++)
        printf("a[%d] = %d\n", i, a[i]);
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值