前言:本文的目的是记录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. UIView详解2

    第三.Configuring the Event-Related Behavior 1.  userInteractionEnabled  property A Boolean value that ...

  2. SCSI miniport 驾驶一个简单的框架

    前段时间,只需用一台新电脑,由于资金有限没有匹配了心仪已久的SSD.我没感觉到飞翔的感觉,总不甘心,仔细想想.我死了相当大的存储,我们可以假设部分内存作为硬盘驱动器把它弄出来.不会比固态硬盘的速度快, ...

  3. Cracking the coding interview--问题与解答

    http://www.hawstein.com/posts/ctci-solutions-contents.html 作者:Hawstein出处:http://hawstein.com/posts/c ...

  4. NET Core控制反转(IoC)

    ASP.NET Core中的依赖注入(1):控制反转(IoC)   ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...

  5. zoj Reactor Cooling

    Reactor Cooling 无源汇上下界最大流问题. 1.流量平衡. 2.满足上下界 模板题. #include <iostream> #include <queue> # ...

  6. android 如何分析java.lang.IllegalArgumentException: Cannot draw recycled bitmaps异常

    这类问题的分析,通常你需要找到bitmap对象已经在那个位置recyle,然后检查代码. 如何定位的位置,其中代码具有对bitmap 目的recyle.能够 Bitmap.java的recycle方法 ...

  7. Oracle学习(十四):管理用户安全性

    --用户(user) SQL> --创建一个名为 grace password是password 的用户,新用户没有不论什么权限 SQL> create user grace identi ...

  8. C# 6.0 (C# vNext) 的新功能:Exception-Handling Improvements

    于 C# 6.0 包裹在异常处理的新功能,有两个方面的改进: 异步处理(async and await)能力 catch block 总结使用.于 C# 5.0 释放 async and await, ...

  9. OTN&互换amp; P-OTN有效降低100G 网络成本 (两)

    OTN互换& P-OTN有效降低100G 网络成本 (两) 在全球范围内.网流量的增长速度是空前的,导致此现象的缘由包含云服务的增长.移动宽带和基于互联网的视频点播服务的增长. Cisco估计 ...

  10. WPF技术触屏上的应用系列(六): 视觉冲击、超炫系统主界面、系统入口效果实现

    原文:WPF技术触屏上的应用系列(六): 视觉冲击.超炫系统主界面.系统入口效果实现 去年某客户单位要做个大屏触屏应用,要对档案资源进行展示之用.客户端是Window7操作系统,54寸大屏电脑电视一体 ...