浅谈c指针(二)

浅谈c语言灵魂——指针

由于最近开学了,又要实习,还要准备考研,好几天没写了。

上次写到指针和数组,今天在看一些c的面试题发现一个很重要的东西就是const了,相信学过c的人一定会说:“const就意味着是常数了”,那只能说明你只懂皮毛了,这里推荐一篇外国大佬 Dan Saks的文章《const T vs T const》,在他的文章里完全概括了所有的用法。

下面的代码什么意思:

	const  int  a;
	int  const  a;
	const  int  *a;
	int  const  *a;
	int*  const  a;
	int  const*  const a ;

一般的int const和const int效果是一样的,a都是一个常数整数型的数,在这里我们只要记住int 与const 哪个放前哪个放后都是一样的,第三个a首先是一个指针其次它是一个指向常整数型的,也就是说*a是常量了,是不能被赋值的,但是a的值是可以改变的,也就是说它可以重新指向另一个地址。看下面的代码:

	int  i1 = 30; 
	int  i2 = 40; 
	const int *a = &i1; 
	a  =  &i2;         /* 注意这里,a可以在任意时候重新赋值一个新内存地址 */ 
	i2  =  80;           /* 注意看:这里不能能用*a = 80 来代替 */ 
	printf("%d\n", *a); /* 输出是 80 */

首先const修饰的是整个a(注意不是a)。所以a是常量,不能被赋值的,即使a所指的i2是变量。

由于前面第一个和第二已经说明const和int谁在前都是一样的,所以第三个和第四个效果也是一样的,这里可能就会问了那怎么用const来修饰a呢?,注意第五个的const的位置,那你就应该明白了。

int *const a (int* const和int *const是一样的,只是风格不同)

先看下面的代码:

	int i1 = 30; 
	int i2 = 40; 
	int *const a = &i1; 
	/* a = &i2; 注意这里,a 不能再这样重新赋值了,即不能再指向另一个新地址第4 行的注释)*/ 
	i1 = 80;               /* 想想看:这里能用 *a = 80; 来代替吗?可以,这里可以通过*a 修改 i1 的值。(第 5 行的注释)*/ 
	/* 请自行与前面一个例子比较。 */ 
	printf("%d", *a);/* 输出是 80 */ 

写到这里相信你们都懂了,a的值是不能重新被赋值的。它只能永远指向初始化时的内存地址了但是你可以通过改变*a来修改i1的值了。

所以说第五个意思 a 是一个指向整型数的常指针(也就 是说,指针指向的整型数是可以修改的,但指针是不可修改的)

与前一个例子对照一下吧!看以下的两点分析:
1)a 因为有了 const 的修饰,所以只是一个指针常量:也就是说 a 值是不可修改的(即 a 不可以重新指向 i2 这个变量了)(请看第 4 行的注释)。
2)整个*a的前面没有 const 的修饰。也就是说,*a 是变量而不是常量,所以我们可以通过*a来修改它所指内存 i1 的值(请看第 5 行的注释)。

总之一句话,这次的 a 是一个指向 int 变量类型数据的指针常量。

也就是说如果 const 修饰在*a 前,则不能改的是*a(即不能类似这样:*a=50;赋值)而不是指 a。 如果 const 是直接写在 a前,则 a不能改(即不能类似这样:a=&i;赋值)。

说完第五个了,接着的int const* const a; 最后一个意味着 a 是一个 指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可 修改的)

const的一些基本用法就这些了,最后补充一下:

1:int  *pi 指针指向 const  int  i 常量的情况
const  int  i1 = 40; 
int  *pi; 
pi  =  &i1;     // 这样可以吗?不行,VC 下是编译错。 
                // const  int 类型的 i1 的地址是不能赋值给指向 int 类型地址的指针 pi 的。否则 pi 岂不是能修改 i1 的值了吗!
pi = (int *) &i1;     //这样可以吗?强制类型转换可是 C 所支持的。
//VC 下编译通过,但是仍不能通过 *pi = 80 来修改 i1 的值。去试试吧!看看具体的怎样。

2:const  int  *pi 指针指向 const  int  i1 的情况
const  int  i1=40; 
const  int  *pi; 
pi = &i1;      // 两个类型相同,可以这样赋值。很显然,i1 的值无论是通过pi 还是 i1 都不能修改的。 

什么还要如此看重关键字 const 呢?
1). 关键字 const 的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数 为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃 圾,你就会很快学会感谢这点多余的信息。(当然,懂得用 const 的程序员很少会留下的垃圾 让别人来清理的。)
2). 通过给优化器一些附加的信息,使用关键字 const 也许能产生更紧凑的代码。
3). 合理地使用关键字 const 可以使编译器很自然地保护那些不希望被改变的参数,防止其 被无意的代码修改。简而言之,这样可以减少 bug 的出现。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值