第3章 C++中的C
| 用union节省内存 |
使用场合:有时一个程序会使用同一个变量处理不同的数据类型,对于这种情况,有两种选择:可以创建一个struct,其中包含所有
可能的不同类型的数据;也可以使用联合union,它能把所有的数据放在一个单独的空间内,它计算出放在union中的最大项所必需的空间数,
来决定union所占用的空间数,使用union可以节省内存。
注意:每当在union中放置一个值,这个值总在union开始的一个地方,因此我们只需要创建一个能容纳任何一个union变量的
“超变量”,所有的union变量地址都是一样的(在类或struct中,地址是不同的)。
例子:
union Packed {
short j;
int k;
long l;
float f;
double d;
};
int main()
{
cout << "sizeof(Packed) : " << sizeof(Packed) << endl \
<< "sizeof(short) : " << sizeof(short) << endl \
<< "sizeof(int) : " << sizeof(int) << endl \
<< "sizeof(long) : " << sizeof(long) << endl \
<< "sizeof(float) : " << sizeof(float) << endl \
<< "sizeof(double) : " << sizeof(double) << endl;
cout << endl;
Packed x;
x.d = 3.14159;
cout << x.d << endl << endl;
cout << "address of(x) : " << hex << &x << endl;
cout << "address of(j) : " << hex << &x.j << endl;
cout << "address of(k) : " << hex << &x.k << endl;
cout << "address of(l) : " << hex << &x.l << endl;
cout << "address of(f) : " << hex << &x.f << endl;
cout << "address of(d) : " << hex << &x.d << endl;
getchar();
return ;
}
运行结果:

| 调试技巧之把变量和表达式转换成字符串 |
介绍:在一个预处理器宏中的参数前面加一个#,预处理器会把这个参数转换成一个字符数组。
例子:
#define P(A) cout << #A << " : " << (A) << endl;
int main()
{
int a = ,b = ,c = ;
P(a); P(b); P(c);
P(a + b);
P((c - a) / b);
getchar();
return ;
}
运行结果:

| 函数指针的定义 |
void *(*(*fp1)(int))[];
float (*(*fp2)(int,int,float))(int);
typedef double (*(*(*fp3)())[])();
int (*(*fp4())[])();
第1行 :fp1是一个指向函数的指针,该函数接受一个整型参数并返回一个指向含有10个void指针数组的指针。
第2行 :fp2是一个指向函数的指针,该函数接受三个参数且返回一个指向函数的指针,该函数接受一个整型参数并返回一个float。
第3行 :fp3是一个指向函数的指针,该函数无参数,且返回一个指向含有10个指向函数指针数组的指针,这些函数不接受参数,且返回double值。
第4行 :不是变量定义而是一个函数定义。fp4是一个返回指针的函数,该指针指向含有10个函数指针的数组,这些函数返回整型值。
例子:
#define DF(N) void N() { cout << "Function " #N " called..." << endl; }
DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);
void (*func_table[])() = { a,b,c,d,e,f,g };
int main()
{
while() {
cout << "press any key from 'a' to 'g' or 'q' to quit" << endl;
char c,cr;
cin.get(c); cin.get(cr);
if(c == 'q') {
break;
} else if(c < 'a' || c > 'g') {
continue;
}
(*func_table[c - 'a'])();
}
getchar();
return ;
}
运行结果:

第3章 C++中的C的更多相关文章
- perl5 第十二章 Perl5中的引用/指针
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
- 第九章 MySQL中LIMIT和NOT IN案例
第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...
- 《Deep Learning》译文 第一章 前言(中) 神经网络的变迁与称谓的更迭
转载请注明出处. 第一章 前言(中) 1.1 本书适合哪些人阅读? 能够说本书的受众目标比較广泛,可是本书可能更适合于例如以下的两类人群.一类是学习过与机器学习相关课程的大学生们(本科生或者研究生). ...
- 第三章 jQuery中的事件与动画
第三章jQuery中的事件与动画 一. jQuery中的事件 jQuery事件是对javaScript事件的封装. 1.基础事件 在javaScript中,常用的基础事件有鼠标事件.键盘事件.wind ...
- CHAPTER 7 Science in Islam 第7章 伊斯兰中的科学
CHAPTER 7 Science in Islam 第7章 伊斯兰中的科学 Galen did not live to see the decline of the Roman Empire, bu ...
- 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具
计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具 一 基础 1:向量分析和变换 两个工具 可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...
- 第一篇 网站基础知识 第4章 Java中Socket的用法
第4章 Java中Socket的用法 4.1 普通Socket的用法 Java中的网络通信是通过Socket实现的,Socket分为ServetSocket和Socket两大类,ServetSocke ...
- 《Java并发编程的艺术》 第9章 Java中的线程池
第9章 Java中的线程池 在开发过程中,合理地使用线程池能带来3个好处: 降低资源消耗.通过重复利用已创建的线程 降低线程创建和销毁造成的消耗. 提高响应速度.当任务到达时,任务可以不需要等到线程创 ...
- C++ primer plus读书笔记——第14章 C++中的代码重用
第14章 C++中的代码重用 1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口. ...
- 我的Android六章:Android中SQLite数据库操作
今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...
随机推荐
- 响应式WEB页面开发实践
转自:https://github.com/markyun/My-blog/issues/27 最近得到一个新任务单,让我用一套页面适应所有主流终端(Android.iPhone.iPad.PC),而 ...
- android apk 文件反编译
最近,自己坑逼的把一个android 项目修改版本的代码删除了.这个项目居然还没上传到源代码管理器.幸好还有apk文件,修改的代码也不多可以反编译一下. 1.下载 dex2jar 获取源码工具 地 ...
- Web服务器的配置与管理
Web服务器的配置与管理(2) 虚拟主机技术 在上篇博文中,我们已经利用IIS搭建好了一台Web服务器,并可以成功访问IIS中自带的默认站点,那么我们是否可以在这台服务器中再创建另外一个Web站点?也 ...
- hibernate主键(generator)生成方式
1) assigned 主键由外部程序负责生成,无需Hibernate参与. 2) hilo 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态. 3) seqhilo 与 ...
- Java日期时间API系列12-----Jdk8中java.time包中的...
package com.xkzhangsan.time.test; import java.time.LocalDateTime;import java.util.Date; import com.x ...
- IPFS问题总结
1.安装包下载 ipfs安装版本下载:https://github.com/ipfs/go-ipfs/releases,这是IPFS的go语言实现版,目前实现的还有js版本. 2.安装与启动 linu ...
- 将js进行到底:node学习10
node.js数据库篇--MySQL NoSQL大行其道的如今,MySQL这样的关系型数据库依然有着不可撼动的位置,对于中型,大型面向对象的项目,关系型数据库依然是首选,真正的项目,应当是将数据库的任 ...
- HTTP 协议的基本知识,包括请求流程、请求方法等
一.什么是http协议? HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和Int ...
- iOS常用框架源码分析
SDWebImage NSCache 类似可变字典,线程安全,使用可变字典自定义实现缓存时需要考虑加锁和释放锁 在内存不足时NSCache会自动释放存储的对象,不需要手动干预 NSCache的key不 ...
- 在linux中下载安装FTP服务
一.环境及需求 阿里云服务器的Centos6.9版本,当时需要用到上传服务,所以我想着先搭建一个ftp,比较方便快捷,但是我参考了网上好多的博客,简单安装是没问题,但是时不时还会遇到好多坑,与其说是博 ...