C语言const的用法(初级)

const的用法

________________________________________________________


const的用法我觉得对于一个以后想着做一个优秀的程序员来说,这是必须熟练掌握的技能。 因为网上有好多的文章介绍

它的写的非 常好,有的我就直接拿过来了~,现在我们来看看他 的用法。

const 要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值.

1、函数体内修饰局部变量

例:

void func(){
const int a=0;
}

const作为一个类型限定词,和int有相同的地位。

const int a;     int const a;

是等价的。于是此处我们一定要清晰的明白,const修饰的对象是谁,是a还是int

const要求他所修饰的对象为常量,不可被改变,不可被赋值,不可作为左值(l-value)。 所以很明显它修饰的是a。

是一个很常见的使用方式:

const double pi=3.14;

在程序的后面如果企图对pi再次赋值或者修改就会出错。 然后看一个稍微复杂的例子。

const int* p;

因为int* p;和 int *p;是等价的。

所以const int (*p)和int const (*p)是等价的。 现在一目了然const 修饰的是谁? 是*p. 所以p+=1;是合法的

*p+=1;是非法的因为const修饰了你。


int* const p;
那这个什么意思?

看const修饰的是什么?  它修饰的p。 但是p是一个int型的指针,所以这个指针的地址没有办法修改。

p+=1;  //这就是非法的
*p+=1;  //这个是合法的



再看一个更复杂的例子,它是上面二者的综合
const int* const p;说明p自己是常量,且p指向的变量也是常量。
于是
p+=1;  //非法
*p+=1; //非法

const 还有一个作用就是用于修饰常量静态字符串。
例如:

const char* name=David;

如果没有const,我们可能会在后面有意无意的写name[4]='x'这样的语句,这样会 导致对只读内存区域的赋值,然后程

序会立刻异常终止。有了 const,这个错误就 能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错

误在编译 期被发现。

2、在函数声明时修饰参数

举个例子void * myMemMove(void *dst,constvoid *src,intcount ) 这是我写的memmove函数的声明,这个函数的意思

就是(任意类型) 把*src的 内容复制给*dst,我们现在很明显的看到*src它只让你 复制,你不能修 改它 值,所以怕你

在以后的函数的定义里出现问题现在在声明里限制你。

3、全局变量

我们的原则依然是,尽可能少的使用全局变量。 我们的第二条规则 则是,尽可能多的使用const。 如果一个全局变量

只在本文件中使用,那么用法和前面所说的函数局部变量没有什 么区别。 如果它要在多个文件间共享,那么就牵扯到

一个存储类型的问题。

有两种方式。
1.使用extern
例如
/* test.h */
extern const double pi;
/* test.c */
const double pi=3.14;

然后其他需要使用pi这个变量的,包含test.h
#include test.h

或者,自己把那句声明复制一遍就好。

这样做的结果是,整个程序链接完后,所有需要使用pi这个变量的共享一个存储区域。


2.使用static,静态外部存储类
/* constant.h */
static const pi=3.14;
需要使用这个变量的*.c文件中,必须包含这个头文件。

前面的static一定不能少。否则链接的时候会报告说该变量被多次定义。
这样做的结果是,每个包含了constant.h的

*.c文件,都有一份该变量自己 的copy, 该变量实际上还是被定义了多次,占用了多个存储空间,不过在加了static关键字

后,解决了文件间重定义的冲突。
坏处是浪费了存储空间,导致链接完后的可执行文件变大。但是通常,这个,小小 几字

节的变化,不是问题。 好处是,你不用关心这个变量是在哪个文件中被初始化的。

其实const我觉得更多是程序员自己限制自己,自己告诉自己后面哪里不能出现错误

举个例子吧。

#include<stdio.h>
#include<Windows.h>
int main()
{
	int *p;
	const int a = 0;
	p = &a;
	*p = 3;
	printf("a= %d \n", a);
	system("pause");
	return 0;
}


现在看看运行结果



其实通过侧面的修改const所修饰的值的,所以这个更多是用来限制程序员的,所以 在日常的代码编写多用const,从我做起,把它当成一种习惯。















  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值