const的理解和用法
const在C中的用法很灵活,下面内容由小编为大家介绍const的理解和用法,供大家参考!
一、关于const的具体定义:
——个人感觉很难对它下一个标准的定义,因为的用法很灵活,似乎对它定义后总无法让人能够明白它的意思,而且容易让人产生误解(也许是偶水平太菜了)。例如,把它有定义:一个能够让变量变成无法修改的常量的关键字。那么,这样的话,就可能让人误解为只要有const在定义变量里面,那变量就无论怎样都无法修改。这样的理解是很片面的(下面用法方面将对这问题做探讨)。因此,本人在此不敢对它下定义,其他参考书好象也没有下定义。
二、关于const的具体作用
——const作用就灵活了,一个表达式中const放置的位置不同,效果可能就不一样了。下面分具体情况分析(当然,所举的情况并非覆盖全部情况)
A。const最经常的用法
1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.
//Example ->
int FindNum(const int array[], int num, int conut);//声明函数
//code...
int FindNum(const int array[], int num, int count)
{
int i;
int flag = 1;
for (i = 0; (i < count) && flag; i++)
{
if (array[i] == num)
{
flag = 0;
break;
}
}
return flag;
}
//code...
上面这例子中,编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么,编译器就会报错了。因此,当你不需要也不想修改数组的数据时,最好用const把数组定义为常量数组。
t可以用来创建数组常量、指针常量、指向常量的指针等:
const char ch = 'a';
const int a[5] = {1, 2, 3, 4, 5};
const int *p = a; //a是一个数组的首地址.p是指向常量的指针
int * const p = a; //a是一个数组的首地址.p是指针常量;
const int * const p = a; //a是一个数组的首地址。p是指向常量的指针常量
前两种情况很简单,现在着重分析一下后三种用法,因为这3种情况容易出错,偶就有时候怕用错了干脆不用const.
——const int *p = a;
//p是指向常量的指针,因此,不可以通过给指针赋值来改变数组
//中的数据,例如:
// *p = 10;
// *(p + 2) = 1;
//假如指向常量指针可以改变值,那么,就等于也改变了数组的数
//据了。假如你不理解,偶倒有一个办法让你理解,你就想你和一
//个人绑在一起,有可能你移动了位置而他不跟着你移动吗!哈哈
——int * const p = a;
//看这表达式,const的位置和第一个不同吧!他们的用法和作用
//就完全不一样了。这时候p是指针常量,我们知道,指针是指向
//了一个数组的首地址,那么,它的位置就不可以改变了。但是你
//现在应该和第一个表达式比较了,现在的数组并不是常量数组,
//所以数组的数据是可以改变的,而指针这时候它是不可以移动的
//,指向数组第一个数据,所以它可以而且只可以改变数组第一个
//数据的.值。这一点请别误解,指针常量只是它的地址不可以改变
//,并不是它指向的内容一定不可以改变,这一点切记!
//好啦。假如你又不理解,偶又有一个比较形象的例子来说明:
//假如有一个固定的人拉着另外一个人的手,注意,固定的人相当
//于他是不可以由其他人来替换的。但是他可以拉其他人的手啊,
//并不一定规定他必须拉同一个人的手啊。现在你应该可以有个比
//较深的印象和理解吧:P
//下面举几个例子帮助理解:
// *p = 2;
// *(p+1) = 10;
// p++;
——const int * const p = a;
//假如前面两种表达式的本质你理解了,这种表达式你来理解根本
//没有问题,const现在有两个,而且一个const的位置是第一种情
//况的位置,第二个const是第二种情况的位置,所以这表达式的功
//能就是前两种情况的作用总合。这里不多说!
//下面举几个例子帮助理解:
// *p = 2;
// *(p + 2) = 10;
// p++;
B。const并不会阻止参数的修改
之所以把这作为一点来谈,就是因为有一些朋友可能会以为在函数参数中用了const就一定不可以改变
参数,这实际上是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下;
#include
#include
void ChangeStr(const char *String);
int main(void)
{
char str[] = "The C programme";
Change(str);
printf(str);
system("Pause");
return 0;
}
void ChangeStr(const char *String)
{
char *Source = (char *)String;
while (*Source)
{
*Source = toupper(*Source);
Source++;
}
}
//end
上面的程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止参数的修改,如果象上面程序那样,个人感觉没什么意义,只会让人容易混乱而已。
关于CONST的用法和理解本人也就只能说这么多了,当然,很可能有更多高级或者少用的用法,由于水平
和经验有限,确实不能再说些什么。
-
直接插入排序(C语言实现)
直接插入排序方法:仅有一个记录的表总是有序的,因此,对于有n个记录的表,可以从第二个记录开始直到第n个记录逐个有序的向有序表中进行插入操作,从而得到n个记录按关键字有序的表。下面一起跟着小编学习一下吧!实现一个直接插入排序的`C语言函数,要求对要排序的元素按...
-
C语言输出菱形的方法
题目:输出行列都相等的菱形,如5行5列:行列123451*2***3*****4***5*分析:当行数等于总行数的一半时,*是递增的,递增为2。当行数大于总行数的一半时,*是递减的,递增为2。设有一个行列为n的菱形,我们用变量i作为行数,以0开始,ik作为n菱第i行要输出的*个数。则i<=n的中值(用m...
-
2017计算机二级C语言精选习题
多做题有助于同学们及时检测自己的学习情况。希望提供的2017计算机二级C语言精选习题,能够帮助大家巩固所学知识,为今后的学习打好基础!(1)OSI模型的'物理层负责下列哪一种功能?A)格式化报文B)为数据选择通过网络的路由C)定义连接到介质的特征D)提供远程文件访...
-
2017年计算机二级C语言的应用
yjbys考试网为您整理了2017年计算机二级C语言的应用,更多计算机等级考试相关信息请访问应届毕业生计算机等级考试网。从前面对C语言的特点的分析中,不难看出C语言具有编程方便、语句简练、功能很强、移植性好等优点,是编程者喜欢使用的一种结构化程序设计语言。C...
相关文章
- 理解PHP5中static和const关键字的差别
- C语言中Static和Const关键字的作用
- C++中const-cast与reinterpret-cast运算符的用法
- Connect to Idle Instance问题的解决方法
- 中考英语阅读理解训练John sent for a doctor
- 提示operating system not found的解决方法
- 中石油职称英语阅读讲解:To Be Content with One's Lot
- MySQL安装时出现current root password的解决方法
- instruction的词汇用法讲解
- 英语单词consist的用法和辨析