前言:本文的目的是记录C这些语言easy忽视的细节。我会每天花一点时间来阅读整理,坚持下去,今天是第一章。也许今天是下个月的第二,明年,今天是第几?……我坚信,,记性不如烂笔头。第四篇了。fight~...

第一篇链接:C语言中easy被忽略的细节(第一篇)

第二篇链接:C语言中easy被忽略的细节(第二篇)

第三篇链接:C语言中easy被忽略的细节(第三篇)

1、void*类型的指针不能參与算术运算。仅仅能进行赋值、比較和sizeof操作的原因?

指针的算术运算还要包括指针所指对象的字节数信息。

2、不能把“&”单独用于一个非变量的东西。不能对字面常量使用“&”来取其地址,由于字面常量保存在符号表中。没有地址概念。数组名是一个指针常量。不能改动数组名的值。比例如以下面语句1与语句2是等价的:

int a[10];                  //语句1
int *const a; //语句2 int b[3][4]; //语句1
int (*const b)[4]; //语句2 int c[3][4][5]; //语句1
int (*const c)[4][5]; //语句2

3、return 0与exit(0)的几点差别

(1)exit结束正在执行的整个程序,仅仅要调用exit就结束,它将參数返回给OS。把控制权交给操作系统;return退出当前函数,返回函数值,把控制权交给调用函数;

(2)exit是系统调用级别。它表示一个进程的结束。return是语言级别的。它表示调用堆栈的返回。

(3)main函数结束时也会隐式地调用exit函数,它将删除进程使用的内存空间,同一时候把错误信息返回给父进程。

(4)main函数返回一个整型值与该值调用exit是等价的。

4、static修饰符是一个可以降低命名冲突的实用工具。比如:static int a;将a的作用域限制在一个源文件内。对于其它源文件,a是不可见的。

可以在多个源文件里定义同名的变量a,仅仅要全部的变量a都被定义为static,或者仅仅仅仅有当中一个变量不是static。

static修饰符也适用于函数。

5、C语言同意程序猿写操作前控制产生的输出数据量,这样的控制能力是通过库函数setbuf实现的。比如:setbuf(stdout, buf);语句将通知输入/输出库,全部写入到stdout的输出都使用buf作为输出缓冲区。直到buf缓冲区被填满或程序猿直接调用fflush,buf缓冲区的内容才实际写入到stdout中。

缓冲区的大小由系统头文件<stdio.h>中的BUFSIZ定义。《C陷阱与缺陷》中有一个样例:

#include <stdio.h>

int main(void)
{
char c;
char buf[BUFSIZ];
setbuf(stdout, buf);
while ((c = getchar()) != EOF)
putchar(c); return 0;
}

以上程序是错误的。

buf缓冲区最后一次被清空是在main函数结束之后,作为程序交回控制给操作系统之前C执行时库所必须进行清理工作的一部分。在此之前buf字符数组已经被释放了。改动的方法有3种:

(1)定义缓冲数组为静态数组static char buf[BUFSIZ];

(2)将缓冲数组拿到main函数外;

(3)动态分配缓冲区。程序中并不主动释放分配的缓冲区。setbuf(stdout, malloc(BUFSIZ));

备注:

(1)因为缓冲区是动态分配的,所以main函数结束时并不会释放该缓冲区。这样C执行时库进行清理工作时就不会发生缓冲区已释放的情况。

(2)假设malloc调用失败,返回NULL指针,此时标准输出不须要进行缓冲。

(3)对于由写操作打开的文件,调用fflush将导致输出缓冲区的内容被实际地写入该文件。

6、为什么向函数传递多维数组时候不须要说明第一维长度而必须说明其它维长度?

(1)数组元素在内存中依照“行优先”规则存储。须要列数确定一行有多少元素;

(2)编译器在计算元素地址时不须要数组第一维的长度,但须要全部其它维的长度信息;

(3)C/C++不正确数组进行越界訪问检查。对编译器来说不须要知道第一维的长度。

7、C语言将多维数组转换为数组指针。

下面4种表达方式是等价的:

a[i][j];
*(a[i] + j);
(*(a + i))[j];
*(*(a + i) + j);

8、在语义上。下标操作符返回的是一个元素的引用。

比如语句1和语句2是等价的:

//语句1
a[3] = 100; //语句2
int &ri = a[3];
ri = 100;

9、不能使用一个元素类型的指针来接收动态创建的多维数组的返回地址。由于一个多维数组在语义上并不等价于一个指向其元素类型的指针。它等价于一个“指向数组的指针”。比例如以下面使用方法是正确的:

char *q = new char[5];
delete []q; char (*p)[4] = new char[5][4];
delete []p;

10、(1)标号(lable)是具有函数作用域的唯一一种标识符。

不管标号定义在函数哪行,函数内嵌套多深,它都能在函数体内不论什么一个地方訪问到。标号一般用在goto语句中,假设goto语句没有使用到该标号,那么该标号将被忽略。(2)当局部变量与某一个全局变量同名时,在函数内部将遮蔽该全局变量。在这一点上是美元范围解析运算符来引用全局变量的一个函数里,例如::a。

版权声明:本文博主原创文章,博客,未经同意不得转载。

C语言easy忽视的细节(第四部分)的更多相关文章

  1. C语言的一些常见细节

    C语言的一些常见细节 对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个 ...

  2. 03--(二)编程实践中C语言的一些常见细节

    编程实践中C语言的一些常见细节(转载) 对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所 ...

  3. C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏

    C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...

  4. C语言中返回字符串函数的四种实现方法

    转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...

  5. C语言库函数大全及应用实例四

    原文:C语言库函数大全及应用实例四                                    [编程资料]C语言库函数大全及应用实例四 couble fmod (double x, dou ...

  6. C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。

    除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...

  7. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  8. Go语言核心36讲(Go语言实战与应用二十四)--学习笔记

    46 | 访问网络服务 前导内容:socket 与 IPC 人们常常会使用 Go 语言去编写网络程序(当然了,这方面也是 Go 语言最为擅长的事情).说到网络编程,我们就不得不提及 socket. s ...

  9. 《玩转D语言系列》一、通过四个版本的 Hello Word 初识D语言

    对于D语言,相信很多朋友还没听说过,因为它还不够流行,跟出自名门的一些语言比起来也没有名气,不过这并不影响我对它的偏爱,我就是这样的一种人,我喜欢的女孩子一定是知己型,而不会因为她外表,出身,学历,工 ...

随机推荐

  1. 泛泰A850 (高通8064+720p)刷4.4专用中文recovery TWRP2.7.1.3版

    欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...

  2. ECshop 表结构

    -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...

  3. Eclipse怎么显示行号,定位某行

    Eclipse怎么显示行号,定位某行 设置显示行号 1 快捷键:Ctrl+F10,点击'Show Line Numbers'即可. 如果取消显示行号,也可以按这个快捷键,然后再点击show line ...

  4. Pro Android学习笔记(六一):Preferences(5):组织Preference

    PreferenceCategory 假设有多个preference,我们希望能在他们组织在一起.有两种方式,一种就是我们在复合preference中,利用PreferenceScreen进行嵌套,或 ...

  5. poj1236 有向图加边变成强连通图

    给我们一个有向图,有两个问题 1.最少要给多少个点发消息,才能使得所有的点都收到消息(消息可以随边传递) 2.最少需要多少条边才能使得图变成强连通图 对于一个强连通分量,可以当做一个点来考虑,所以我们 ...

  6. session校验是否登录

    由于一个网站要有好多页面,如果每个页面都写上检验session是否为空,太麻烦了,所以写个工具类,就方便了. 1首先创建一个类库Common 2,然后在这个类库添加引用 3在Common继承 :Sys ...

  7. Android 大约Dialog弹出窗口

    直接效果图: 实现步骤: 1.主界面activity_main.xml非常easy,一个button <RelativeLayout xmlns:android="http://sch ...

  8. Android 自己的自动化测试(2)依据ID查找对象(java)

    前一篇文章是写 Android 自己的自动化测试(1)如何安装和卸载应用程序(java) ,以下再探索一下假设在普通java应用程序中,依据ID来查找对象 1.类库依赖: The library de ...

  9. AES加密 C++调用Crypto++加密库 样例

    这阵子写了一些数据加密的小程序,对照了好几种算法后,选择了AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES).听这名字就非常厉害的样子 预计会搜索到这 ...

  10. UE4编码规范

    翻译原文为Unreal 的官方!自己看着总结了一下,不一定每条都能对上.不足之处,请多多不吝赐教! 原文地址:  unreal CodingStandard UE4编码规范 在Epic,有简单几条代码 ...