• 帮助
    • 博客
    • 相册
    • 网盘
    • 超市
    • Xer吧
  • 登录
  • 注册
【公告】个人空间首页新增“我的专辑”版块    【公告】X5dj广告过滤系统上线    【公告】关于调整网盘空间图片大小计算方法的通告    【公告】新功能“我的专辑”上线,珍藏属于你的美好回忆    【公告】X5dj网站网络硬盘用户使用协议    【公告】新增用户操作记录展示功能,帮助您更好的与朋友们互动    【公告】X5dj新功能汇总贴:新增“密码目录”功能上线    【公告】X5dj.com相册/网盘上传工具发布    
  • hitsuns的个人空间
  • http://www.x5dj.com/hitsuns 复制地址
  • 首页

  • 博客

  • 相册

  • 网盘

  • 人际关系网

  • 我的专辑

loading...
C语言之指针综合谈 < 上一篇 下一篇 > XP中如何限制“我最近的文档”
C补遗
hitsuns 发表于: 2007-03-10 11:10 来源:转载  X度:0  浏览:(326)  评论:(0)
收藏 | 复制地址 | [举报此文章] |  大 中 小 |  引用 删除 修改

C补遗

基础

字符数组拼接

C 预处理器 有字符数组的拼接功能:两个加引号的字符数组领接,中间没有标点, 则会被连接成一个字符数组。可用于将很长的字符内容分行定义。


char str[] = "abc" 
             "def";

常用宏

  1. #define / #undef
  2. #ifdef / #ifndef
  3. #if / #else / #endif

函数

函数参数省略名称

函数申明参数可以省略名称, 只有在函数内需要取用时才有效,在声明中的参数名会被编译器忽略。


bool my_function(int, char &, void *)

参数传递

函数参数(除数组)以值传送(存放在临时变量中)。对于数组,其起始元素的地址最为参数被传入函数。

空参数表

C中,空参数表的函数可以带任意参数(任意书目,任意类型)。因此,ANSI C中声明空参数表,使用void关键字,而C++中,意味着不带参数的函数。

指针

指针运算中,其单位是指针所指数据类型大小

指针的算术运算

基础:
  1. 不能将两个指针相加
  2. 指针相减,结果为两个指针之间间隔的元素个数
  3. 一个指针可以加上或减去一个整数,以元素为单位移动指针

char和int

c的类型不能是char类型,以能够足够大存放EOF


int c;
while((c = getchar()) != EOF)
  putchar(c);

赋值结合次序右到左


a = b = c = 0;
a = (b = (c = 0));

extern

如果在函数中使用全局变量,需extern声明。如果全局变量的定义在函数前,则可忽略。全局变量的定义在其他文件,则必须extern声明。一般将extern声明放在文件头或者单独方在.h文件中

位运算符

主要位运算符:

  1. &: 与
  2. |: 或
  3. ^:异或,两个操作数对应位不同为1,否则为0
  4. <<: 左移,空位0填补
  5. >>: 右移
  6. ~:求反

关键字

register

register关键字建议编译器使用CPU寄存器

程序块结构

基础:
  1. 变量的声明和初始化紧跟在任何标识复合语句开始的左括号后(包括常见的函数定义的左括号后)
  2. 另外函数参数变量也会隐藏同名的外部变量

int i = 0;
foo(float x) {
   x... /* 隐藏同名的x外部变量 */
}

if (n > 0) {
  int i; /* 新的变量 */
  float x = 1.0;
  for (i = 0; i < n; i++) {
  ...
  }
  foo(x)
}

初始化

基础:
  1. 不进行初始化,外部变量和静态变量被初始化为0,局部变量和自动变量初始值不确定
  2. 外部变量和静态变量的初始化表达式必须是常量表达式,且只初始化一次
  3. 数组初始化:int days[] = {1, 2, 3}; 省略数组长度时,编译器自动计算
  4. 字符数组是个特殊:char str[] = “hello”; 编译器自动在最后加上’\0’
  5. 多维数组(特殊的一维数组) int matrix[][] = {{1,2}, {3,4}};

另,以多维数组为参数的函数声明,以下三种相同(可能的区别是定义后内存的分配):

  1. foo(int (*days)[13]) {...} /* 参数是指针,指向具有13个整数的一维数组 */
  2. foo(int days[2][13]) {...}
  3. foo(int days[][13]) {...}

其它含义:


int *days[13]; /* 声明了一个有13个元素的数组,每个元素是指向整型对象的指针 */

宏

undef指令可取消名字的宏定义

宏作为函数展开的缺点:

  1. 作为参数的表达式重复计算
  2. 必须使用圆括号保证计算次序

其它的一些宏特性在C++中已属无用,略。

结构

定义:


struct point {
    int x;
    int y;
};

使用:


struct point pt;
struct point pt2 = {120, 240};

sizeof

返回一个整形值,等于指向对象或类型所占用的存储空间字节数(无符号整型size_t)

对象:变量,数组或结构类型:基本类型,派生类型

比如计算一个Key结构数组的元素个数(数组名为keys)


size_t count = sizeof(keys) / sizeof(struct Key)

例子(count的值为3):


struct Key {
 int x;
 int y;
};

struct Key keys[] = {{1,2}, {2, 3}, {5, 7}};
unsigned int count = sizeof(keys)/ sizeof(struct Key);

typedef

typedef类似预处理中的#define,但由编译器处理,故功能更强

例子:


typedef unsigned int Length

typedef char *String; // 将String定义为与char*同义

typedef point {
    int x,
    int y;
} Point, *PointPtr; // Point与struct point同义, PointPtr是struct point的指针

(可以使srtuct的名字和typedef的名字相同,方便使用)

typedef int (*PFI)(char *, char *) // 类型PFT是函数指针

作用:

  1. 简洁
  2. 参数化,提高可移植性(比如不同大小的整形值)
  3. 提供更好的说明性,如PointPtr.。

注:

考虑PointPtr a, b; 和 int* a, b;的区别。前一个a,b都是指针类型,后一个只有a是指针类型,而b是int类型

联合

  1. 在单块存储区中管理不同类型的数据
  2. 联合中的任何类型的对象都可赋值给该联合
  3. 程序员保证读取的类型是最后一次存入的类型
  4. 使用:联合名.成员 或 联合指针->成员
  5. 事实上,联合就是结构(所有成员相对于基地址的偏移都是0,结构空间容纳最大的成员,对齐所有类型的成员)
  6. 只能用第一个成员的类型初始化

标志位测试

例:


enum {
    E = 02;
    S = 04;
};
  • 将flag的E和S置为1

flag |= (E | S)

  • 将flag的E和S置为0

flag &= ~(E | S)

  • 测试flag的E和S

(flag &= (E | S)) == 0

可用位字段简化:


struct {
  unsigned int E : 1;
  unsigned int S : 1;
}

冒号后的数字表示字段的宽度(二进制)

volatile

强制某个实现屏蔽可能的优化

malloc/clloc和free的实现

参考 The C Programming Language 第8章的相关论述

setjmp和longjmp

提供了一种不同于通常的函数调用和返回顺序的方法,允许立即从一个深层嵌套的函数中返回。可被用来实现异常概念。

简单的说:setjmp()保存寄存器的值,而longjmp()将其恢复之

更具体的描述参考 CS360 Lecture notes—Setjmp and Longjmp

具体过程如下:

  1. 我们调用setjmp(),将寄存器数据存在我们传给setjmp()的结构中,然后返回0
  2. 调用longjmp(),除了传入先前的存放寄存器数据的结构,另外传入一个返回值,比如说8(非0)
  3. longjmp()的作用是恢复寄存器数据,即回到刚刚调用完setjmp()保存寄存器数据的地方。
  4. 不同的是这次longjmp()返回值是longjmp()传入的那个值(非零),以示区分
 
_uacct = "UA-379019-6"; urchinTracker();
 
系统分类:
标签:技术   IT   
推送: IT·互联网 IT原创   IT·互联网 应用·管理    归类:资料知识

 
C语言之指针综合谈 < 上一篇 下一篇 > XP中如何限制“我最近的文档”
用户回复
首页 上一页 1 下一页 尾页 共 1 页
评分与快速回复

博主推荐
相关文章
  • ·甜蜜间谍
  • ·最遥远的距离
  • ·极品刻录软件:Ones v2.1.358 简体中文绿色版&单文件版
  • ·Google Earth专业版 - Google Earth Pro v4.2.0205.5730 简体中文绿色版
  • ·Duplicate Cleaner v1.3 汉化绿色版 - 免费的重复文件查找工具
  • ·Windows Live Messenger v8.5.1302.1018 简体中文去广告绿色版
  • ·TechSmith Camtasia Studio v6.0.0 汉化绿色特别版 - 强大的屏幕录制工具
  • ·Face-Bon 棒片磨皮 v1.0 中文绿色版 - 神奇的人像图片优化软件
  • ·Adobe Photoshop CS4 Extended 官方英文/简体中文/繁体中文绿色特别版
  • ·Cold winter
  • ·我寨威武!年度十大最囧最雷人山寨手机
  • ·波波虎(网络家庭影院)VS暴风影音 数分流人物,还看今朝!
  • ·日本搜索集合
  • ·有线电视、卫星电视的网络播放 PC网络电视 直播系统 视频点直播 党校视频点直播系统
  • ·视频点直播在政府行业的应用 校园视频点直播系统
  • ·梁念坚简介简历 微软梁念坚资料照片
博友热推
  • 我该走开, 还是该安静地留下来?
  • 时光流逝了,真的不想一个人过了
  • 原来不是光有真才实学就能成功的
  • 生活在我视野下呈现出与人的不同
  • 爱自己太多就免不了变得自私冷漠
  • 这才刚下了飞机,就感觉中了圈套
  • 经济危机是事实,败家还是要继续
  • 今年好多对情侣都没逃过七年之痒
  • 一直觉得埃及艳后这个女人很神秘
  • 现如今医院怎么都变得这么阴暗呢
关于我们 | X5dj动态 | 加入我们 | 友情链接 | 官方日志 | 免责声明 | 举报不良信息
北京开创明天科技有限公司 版权所有 京ICP证040979号