C语言easy忽视的细节(第四部分)
前言:本文的目的是记录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忽视的细节(第四部分)的更多相关文章
- C语言的一些常见细节
C语言的一些常见细节 对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个 ...
- 03--(二)编程实践中C语言的一些常见细节
编程实践中C语言的一些常见细节(转载) 对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所 ...
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- C语言中返回字符串函数的四种实现方法
转自C语言中返回字符串函数的四种实现方法 其实就是要返回一个有效的指针,尾部变量退出后就无效了. 有四种方式: 1.使用堆空间,返回申请的堆地址,注意释放 2.函数参数传递指针,返回该指针 3.返回函 ...
- C语言库函数大全及应用实例四
原文:C语言库函数大全及应用实例四 [编程资料]C语言库函数大全及应用实例四 couble fmod (double x, dou ...
- C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。
除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...
- 编程实践中C语言的一些常见细节
对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...
- Go语言核心36讲(Go语言实战与应用二十四)--学习笔记
46 | 访问网络服务 前导内容:socket 与 IPC 人们常常会使用 Go 语言去编写网络程序(当然了,这方面也是 Go 语言最为擅长的事情).说到网络编程,我们就不得不提及 socket. s ...
- 《玩转D语言系列》一、通过四个版本的 Hello Word 初识D语言
对于D语言,相信很多朋友还没听说过,因为它还不够流行,跟出自名门的一些语言比起来也没有名气,不过这并不影响我对它的偏爱,我就是这样的一种人,我喜欢的女孩子一定是知己型,而不会因为她外表,出身,学历,工 ...
随机推荐
- 【cocos2d-x制作别踩白块儿】第一期:游戏介绍
这一系类文章.我们将来分析时下最火的一款游戏 -- 别踩白块儿. 无图无真相,先上图 这就是我们终于要完毕项目的效果图. 游戏刚開始的最以下有一栏为黄色,紧接着上面每一行都是有一个黑色块,其余为白色块 ...
- VS解决BEX错误但不能关闭DEP保存
报道近期计划BEX错误: 问题签名: 问题事件名称: BEX 应用程序名: Auth.exe 应用程序版本号: 0.0.0.0 应用程序时间戳: 546d9e0c 故障模块名称: Auth.exe 故 ...
- oracle迁移mysql数据库注意(转)
oracle转mysql修改: 1. substr() substr( string , 0, 10) 这里测试 必须从 第一位获取 既是 substr(string , 1 , 10)2. to_c ...
- 什么是 CGI,什么是 IIS,什么是VPS
该公司来到天.我们所从事的事情在网站上.这对我来说确实是一个很大的挑战.个人一直从事Android,对于web而一个开发网站server知识的几乎为零.在这里应该说,现在我只是有一个技术人员,昨天相遇 ...
- Spring官方网站的改版后下载
Spring官方网站改版很长一段时间后还没有找到直接下载Jar链接包,下面总结了一些方法,可在网上,亲測可用. 1.直接输入地址,改对应版本号就可以:http://repo.springsource. ...
- Java 8 时间日期库的20个使用示例
java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之, ...
- ubuntu10.10和windows双系统启动顺序的修改
我想大部分童鞋装ubuntu的时候,硬盘上的windows肯定还是保留着的,启动电 脑时可以选择,想进windows就进windows,想进ubuntu就进ubuntu.但装完ubuntu后,它默认启 ...
- Eclipse中为什么创建DynamicWebProject后没有默认的web.xml文件?
在Eclipse中新建DynamicWebProject的时候不要直接点"完毕",在下一步有个勾选项(Generate web.xml deployment descriptor) ...
- shell文字过滤程序(十):cut命令
[版权声明:转载请保留源:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] cut指挥类似至awk,从行内提取的信息,它是一个较弱的版本的功能 ...
- 冒泡排序java
先对冒泡排序做一个简单的解释,然后是代码的实现.解释出资<java的数据结构和算法>,大家可以看看. 排序类: package com.dxx.order; public class Bu ...