C语言中正确使用const

基本解释

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。

虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。

问题:const变量 & 常量

为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?

const int n = 5;

int a[n]; 

答案与分析:

1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。

2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。

3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

问题:const变量 & const 限定的内容

下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?

typedef char * pStr;

char string[4] = "abc";

const char *p1 = string;

const pStr p2 = string;

p1++;

p2++;

答案与分析:

问题出在p2++上。

时间: 2024-09-12 23:56:43

C语言中正确使用const的相关文章

C语言中关键字auto、static、register、const、volatile、extern的作用

原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.extern 这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)reg

解析C语言中如何正确使用const_C 语言

基本解释 const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助.虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题. 问题: const变量 & 常量为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?const int n = 5;int a[n]; 答

Go语言中反射的正确使用_Golang

介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 反射有两个问题,在使用前需要三思: 大量的使用反射会损失一定性能 Clear is better than clever. Reflection is never clear. Go的类型设计上有一些基本原则,理解这些基本原则会有助于你理解反射的本质: 变量包括 <type, value> 两部分.理解这一点你就知道为什么nil != nil了. t

struct-C语言中结构体中的数组,不能直接赋值吗

问题描述 C语言中结构体中的数组,不能直接赋值吗 设有定义:struct{char mark[12];intnum1;double num2;}t1,t2;若变量均已正确赋初值,则以下语句中错误的是(C) (A) t1=t2; (B) t2.num1=t1.num1; (C) t2.mark=t1.mark;//mark为结构体中的数组,不能直接赋值?? (D) t2.num2=t1.num2; ?====如题参考答案说为结构体中的数组,不能直接赋值,为什么呢?那应该怎么赋值呢?求大侠指教 解决

简单总结C语言中各种类型的指针的概念_C 语言

C语言中有很多关于指针的使用,指针也是C语言的灵魂所在,而且C语言中也有很多有关指针的概念,这里学习并总结了一些知道的概念.  常量指针:首先它是一个指针,常量只是用来修饰指针的定语.其定义如下: char const * cp; char a='a'; 如何识别呢?根据右结合优先,先是*优先,所以这个cp变量是一个指针,然后是const修饰*,所以这是一个常量指针.即指向常量的指针. cp=&a; //正常语法 *cp=a; //错误语法,因为其指向的值是一个常量  指针常量:首先它是一个常量

LLVM提议向C语言中加入模块机制

作者 Alex Blewitt ,译者 臧秀涛 发布于 十二月 05, 2012 在今年11月的LLVM开发者大会上,来自Apple的Doug Gregor做了一场讲座,主题是向C语言中加入模块(Module)机制.讲座中提到: 长期以来,C的预处理器就是程序员和工具的问题之源.写得不好的头文件致使宏污染和包含顺序等问题大量存在,程序员必须不断地与之斗争.为了缓解这些问题,开发者习惯上采用各种预处理器变通方案,比如LONG_MACRO_PREFIXES这种风格的很长的宏前缀,#include防卫

C语言中函数的声明、定义及使用的入门教程_C 语言

对函数的"定义"和"声明"不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否正确,实参与形参的类型和个数是否一致),它不包括函数体.--谭浩强 ,<C程序设计>(第四版),清华大学出版社,2010年6月,p182 这段论述包含了许多概念性错误,这

指针-c语言中字符数组初始化问题

问题描述 c语言中字符数组初始化问题 字符数组初始化1: char str[]=""123"";//不报错2: char str[4]; str=""123"";//不能将const char[4] to char[4]字符指针初始化1: char *str=""123"";//不报错2: char *str; str=""123"";//不报错求

Java语言中字符的处理

山西省网络管理中心任军 ----摘要:本文主要讨论了Java语言中字符的特殊表达形式,尤其是中文信息的表达处理,阐述了字符处理的关键是要将十六位Unicode字符,转换为本地下层平台,也就是运行Java虚拟处理机的平台能够理解的字符形式. ----关键词:Java.字符.8位.16位.Unicode字符集 ----Java是一种编程语言.一个运行系统.一套开发工具和一个应用程序编程界面(API).Java建立在C++的熟悉.有用的特征之上,而取消了C++的复杂的.危险的和多余的元素.它是一个更安