分享

《C语言深度剖析》关键字介绍七

 走出尘埃 2016-03-16

感谢您关注莫日根电气电子工作室微信!如果您尚未关注,请点击标题下方的“莫日根电气电子工作室”关注我们

《C语言深度剖析》关键字介绍七

看了这么几天的关键字,突然间意识到32个关键字看似不多,但要学习掌握的却是很多。这几天同事问我为什么学习《C语言深度剖析》还要自己再这样的敲写一遍?我想这样可以更好的过一遍大脑吧!也还因为这样做感觉像是大家一起在学,毕竟现在人们是在时间碎片化学习,这样也算是分享吧!

说说今天的第一个关键字吧!

return关键字

return 用来终止一个函数并返回其后面跟着的值。

return (Va l);// 此括号可以省略。但一般不省略,尤其在返回一个表达式的值时。

return 可以返回些什么东西呢?看下面例子:

char * Func(void)

{

char str[30];

return str;

}

str 属于局部变量,位于栈内存中,在Func结束的时候被释放,所以返回str将导致错误。

【return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁】

const关键字

const 关键字也许该被替换为 readolny

const是constant 的缩写,是恒定不变的意思,也翻译为常量、常数等。很不幸,正是因为这一点,很多人都认为被 const修饰的值是常量。这是不精确的,精确的说应该是只读的变量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。或许当初这个关键字应该被替换为readonly 。那么这个关键字有什么用处和意义呢?

const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。我们看看它与define 宏的区别。(很多人误以为define 是关键字,在这里我提醒你再回到本章前面看看32个关键字里是否有define)。

const 修饰的只读变量

定义const只读变量,具有不可变性。

例如:

const int Max=100;

int Array[Max];

这里请在VisualC++6.0 里分别创建.c 文件和.cpp 文件测试一下。你会发现在.c 文件中,编译器会提示出错,而在.cpp 文件中则顺利运行。为什么呢?我们知道定义一个数组必须指定其元素的个数。这也从侧面证实在 C 语言中,const修饰的Max 仍然是变量,只不过是只读属性罢了;而在C++ 里,扩展了const的含义,这里就不讨论了。

注意:const修饰的只读变量必须在定义的同时初始化,想想为什么?

留一个问题:case 语句后面是否可以是const修饰的只读变量呢?请动手测试一下。

节省空间,避免不必要的内存分配,同时提高效率

编译器通常不为普通const只读变量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。

例如:

#define M 3 //宏常量

const int N=5; // 此时并未将N 放入内存中

......

int i=N; // 此时为N 分配内存,以后不再分配!

int I=M; // 预编译期间进行宏替换,分配内存

int j=N; // 没有内存分配

int J=M; // 再进行宏替换,又一次分配内存!

const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。#define宏是在预编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。

修饰一般变量

一般常量是指简单类型的只读变量。这种只读变量在定义时,修饰符 const可以用在类型说明符前,也可以用在类型说明符后。例如:

int const i=2; 或 const inti=2;

修饰数组

定义或说明一个只读数组可采用如下格式:

int const a[5]={1, 2, 3, 4, 5};或

const int a[5]={1, 2, 3, 4, 5};

修饰指针

const int *p; // p可变,p 指向的对象不可变

int const *p; // p 可变,p 指向的对象不可变

int*constp; //p 不可变,p 指向的对象可变

const int*const p; // 指针p 和p 指向的对象都不可变

在平时的授课中发现学生很难记住这几种情况。这里给出一个记忆和理解的方法:

先忽略类型名(编译器解析的时候也是忽略类型名),我们看 const离哪个近。“近水楼台先得月”,离谁近就修饰谁。

const int *p; //const 修饰*p,p 是指针,*p是指针指向的对象,不可变int const * p;//const修饰*p,p 是指针,*p是指针指向的对象,不可变

int*const p;//const修饰p,p 不可变,p 指向的对象可变

const int *constp; // 前一个const修饰*p,后一个const修饰p ,指针p 和p 指向的对象都不可变。

修饰函数的参数(感觉这个以后可以试试)

const修饰符也可以修饰函数的参数,当不希望这个参数值被函数体内意外改变时使用。例如:

void Fun(const int i);

告诉编译器i 在函数体中的不能改变,从而防止了使用者的一些无意的或错误的修改。

修饰函数的返回值

const修饰符也可以修饰函数的返回值,返回值不可被改变。例如:

const int Fun (void);

在另一连接文件中引用const只读变量:

extern const int i; // 正确的声明

extern const int j=10; //错误!只读变量的值不能改变。

注意这里是声明不是定义,关于声明和定义的区别,请看本章开始处。

讲了这么多讲完了吗?远没有。在 C++ 里,对 const做了进一步的扩展,还有很多知识未能讲完。有兴趣的话,不妨查找相关资料研究研究。

《C语言深度剖析》关键字介绍七

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多