一、引用参数和指针的转换

标准C不支持引用参数,对此需进行转换。下面以bo1-1.cpp和bo1-1.c中DestroyTriplet()函数为例来说明这种转换。

bo1-1.cpp中含有引用参数的函数如下:

 Status DestroyTriplet(Triplet &T) {
// 操作结果:三元组T被销毁
free(T);
T=NULL;
return OK;
}

转换后在bo1-1.c中的标准C程序如下:

 Status DestroyTriplet(Triplet *T) /* 将&T改为*T */
{ /* 操作结果:三元组T被销毁*/
free(*T); /* 将T改为*T */
*T=NULL; /* 将T改为*T */
return OK;
}

对照以上2个函数可见:将C++函数形参表中以&打头的参数改成以*打头的参数,再在函数中该参数前加*即可。

要注意的是,在这两个函数中,形参的类型是不同的。在bo1-1.cpp中,T的类型是Triplet;在bo1-1.c 中,T的类型是Triplet的指针。

但为方便起见,没有改写C程序中的注释。另外,在标准C程序中调用该函数,实参前应加&。

如main1-1.cpp中调用DestroyTriplet()的语句为

 DestroyTriplet(T);

相应的标准C程序main1-1.c 中调用DestroyTriplet()的语句为

 DestroyTriplet(&T);

其中,在调用DestroyTriplet()的两程序中,两实参T的类型是相同的。

另外,在转换过程中,遇到&*或*&可“抵消”,即将*&T转换为T。

二、标准C在指明所定义的结构体或枚举类型时,在类型前要加strutc或enum,而C++则不必加

如在C++的c2-1.h中定义结构体SqList如下:

 struct SqList {
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};

C++在指明变量或形参的类型时,只需用SqList即可。如bo2-1.cpp中的一个函数如下:

 int ListLength(SqList L) {
// 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数
return L.length;
}

如果在标准C程序中像C++的c2-1.h那样定义变量L的类型,则在bo2-1.c中该函数应如下:

 int ListLength(struct SqList L) {
/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/
return L.length;
}

说明变量L时要用struct SqList。当用到某个结构体就要在其类型前加struct,用到某个枚举类型就要在其类型前加enum是很麻烦的。

为了方便起见,可用typedef定义类型。在标准C程序的c2-1.h中定义SqList如下:

 typedef struct {
ElemType *elem; /* 存储空间基址*/
int length; /* 当前长度*/
int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
}SqList;

这样,在bo2-1.c中相应的函数为

 int ListLength(SqList L) {
/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/
return L.length;
}

这个函数与bo2-1.cpp 很相似。可见,只要在定义结构体时使用typedef,则在指明结构体的类型时就不必加struct。

标准C都采用这种方法定义结构体。定义枚举类型时使用typedef 的方法与此类似。

三、标准C的共用体必须有变量名,而C++可以省略

如在c5-6.h(C++)中定义GLNode1如下:

 // c5-6.h 广义表的扩展线性链表存储结构
enum ElemTag{ATOM,LIST}; // ATOM==0:原子,LIST==1:子表
typedef struct GLNode1 {
ElemTag tag; // 公共部分,用于区分原子结点和表结点
union // 原子结点和表结点的联合部分
{
AtomType atom; // 原子结点的值域
GLNode1 *hp; // 表结点的表头指针
};
GLNode1 *tp; // 相当于线性链表的next,指向下一个元素结点
}*GList1,GLNode1; // 广义表类型GList1是一种扩展的线性链表

注意:其中的共用体没有变量名。在bo5-6.cpp 中的函数GListEmpty()如下:

 Status GListEmpty(GList1 L) {
// 初始条件:广义表L存在。操作结果:判定广义表L是否为空
if(!L||L->tag==LIST&&!L->hp)
return OK;
else
return ERROR;
}

而标准C的c5-6.h如下:

 /* c5-6.h 广义表的扩展线性链表存储结构*/
typedef enum{ATOM,LIST}ElemTag; /* ATOM==0:原子,LIST==1:子表*/
typedef struct GLNode1 {
ElemTag tag; /* 公共部分,用于区分原子结点和表结点*/
union /* 原子结点和表结点的联合部分*/
{
AtomType atom; /* 原子结点的值域*/
struct GLNode1 *hp; /* 表结点的表头指针*/
}a;
struct GLNode1 *tp; /* 相当于线性链表的next,指向下一个元素结点*/
}*GList1,GLNode1; /* 广义表类型GList1是一种扩展的线性链表*/

它内部的共用体必须有变量名。在bo5-6.c 的函数GListEmpty()中也变动如下:

 Status GListEmpty(GList1 L) {
/* 初始条件:广义表L存在。操作结果:判定广义表L是否为空*/
if(!L||L->tag==LIST&&!L->a.hp)
return OK;
else
return ERROR;
}

四、C++可重载

即在一个程序中,可有几个同名的函数同时存在。只要它们的形参个数或类型有所不同即可。

标准C不可重载。在C++转换成标准C时,必须将同名函数改为不同名。

如在bo9-2.cpp中有1个SearchBST()函数(算法9.5(b)),在bo9-2.cpp所包含的文件func9-1.cpp中也有1个SearchBST()函数(算法9.5(a)),但这两个同名函数的形参个数不同。

C++根据函数的形参个数可分辨所调用的是哪个函数。而标准C没有这个能力,所以把bo9-2.c中的SearchBST()函数改为SearchBST1()函数。

五、C++允许在执行语句中变量使用之前定义变量

如algo8-1.cpp 中的PrintUser()函数:

 void PrintUser(Space p[]) {
// 输出p数组所指的已分配空间
for(int i=;i<MAX/e;i++)
if(p[i]) // 指针不为0(指向一个占用块) {
printf("块%d的首地址=%u ",i,p[i]); // 输出结点信息
printf("块的大小=%d 块头标志=%d(0:空闲1:占用)",p[i]->size,p[i]->tag);
printf(" 块尾标志=%d\n",(FootLoc(p[i]))->tag);
}
}

这种形式在标准C 语言中是不允许的。相应的algo8-1.c 中的PrintUser()函数为:

 void PrintUser(Space p[]) {
/* 输出p数组所指的已分配空间*/
int i;
for(i=;i<MAX/e;i++)
if(p[i]) /* 指针不为0(指向一个占用块) */ {
printf("块%d的首地址=%u ",i,p[i]); /* 输出结点信息*/
printf("块的大小=%d 块头标志=%d(0:空闲1:占用)",p[i]->size,p[i]->tag);
printf(" 块尾标志=%d\n",(FootLoc(p[i]))->tag);
}
}

六、C++允许在转换类型时采用函数的形式

如algo8-2.cpp中AllocBuddy()函数的,一条语句如下:

 pi=pa+int(pow(,k-i));

而在标准C程序algo8-2.c中必须改为以下形式(注意带下划线部分):

 pi=pa+(int)pow(,k-i);

七、在C++中可用new申请空间

如bo8-1.cpp 中主函数main()的一条语句如下:

 p=new WORD[MAX+]; // 申请大小为MAX*sizeof(WORD)个字节的空间

在标准C的bo8-1.c中要改为

 p=(WORD*)malloc((MAX+)*sizeof(WORD)); /* 申请大小为MAX*sizeof(WORD)个字节的空间*/

八、在C++中可用cout和cin做输入输出语句

它们的好处是不必给出格式符。这样,当变量的类型发生变化时,不必修改语句。但在main1-1.c 中必须改为

 printf("%d %d %d\n",T[],T[],T[]);/*当ElemType的类型变化时,要相应改变printf()的格式符*/

九、在C++中“//”后到本行末的内容为注释,而标准C的注释必须放在“/*”、“*/”之间

十、标准C 程序的扩展名为.c,C++程序的扩展名为.cpp

定义数据存储结构的文件,其扩展名是.h,在两种语言中不能混用。

C和C++格式转换的更多相关文章

  1. FFmpeg学习4:音频格式转换

    前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...

  2. 【视频处理】YUV与RGB格式转换

    YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...

  3. 日期格式转换 java 2016-09-03T00:00:00.000+08:00

    /**  * 日期格式转换yyyy-MM-dd'T'HH:mm:ss.SSSXXX  (yyyy-MM-dd'T'HH:mm:ss.SSSZ) TO  yyyy-MM-dd HH:mm:ss  * @ ...

  4. RSA密钥之C#格式与Java格式转换

    前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...

  5. 【VC++技术杂谈007】使用GDI+进行图片格式转换

    本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp.jpg.png. 1.加载GDI+库 GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API.为了使 ...

  6. Oracle日期格式转换,tochar(),todate()

    Oracle日期格式转换 本文主要介绍Oracle中的日期转换. 1. 日期转化为字符串 (以2016年10月20日为例) select to_char(sysdate,'yyyy-mm-dd hh2 ...

  7. C#返回时间格式转换成 js 字符串

    在.net 中,调用 post 或者 get和后台通信时,如果有时间返回信息,后台返回的时间信息一般是这样格式:Thu Jul 9 23:14:53 UTC+0800 2015,那么要在前台显示就会有 ...

  8. SpringMVC与MyBatis整合之日期格式转换

    在上一篇博客<SpringMVC与MyBatis整合(一)——查询人员列表>中遗留了日期格式转换的问题,在这篇记录解决过程. 对于controller形参中pojo对象,如果属性中有日期类 ...

  9. JAVA,NET RSA密钥格式转换

    JAVA和NET RSA密钥格式相互转换(公钥,私钥) 做了一个小项目遇到java和.net非对称加密问题,java的公钥和私钥就直接是一个字符串的形式展示的,但是.net是以xml简单包裹形式展示的 ...

  10. JS时间格式 GMT格式转换

    JavaScript时间格式转换总结 1.当前系统区域设置格式(toLocaleDateString和toLocaleTimeString) 例子:(new Date()).toLocaleDateS ...

随机推荐

  1. Sum of bit differences among all pairs

    This article was found from Geeksforgeeks.org. Click here to see the original article. Given an inte ...

  2. 六. 异常处理7.throw:异常的抛出

    到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下:    throw ThrowableInstance;这里,Thr ...

  3. linux之ssh无密码访问

    1. windows下用putty执行ssh连接vmware中的linux虚拟机 linux虚拟机的网络选择bridge模式,ifconfig 看到ip后与windows local machine之 ...

  4. Java继承是复制还是共用?答案共用

    继承是复制还是共用?例如 Dog类继承Animal类,在Dog中的属性修改,Animal中的属性也会一起改变吗?如果用Dog和Animal分别实例化对象,dog和animal,这两者的属性是公用还是各 ...

  5. 全面理解java自动装箱和拆箱(转)

    自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如 ...

  6. JAVA生成问答式验证码图片,支持加减算法

    原文:http://liuguihua0823.iteye.com/blog/1511355 import java.awt.Color; import java.awt.Font; import j ...

  7. FIREDAC驱动MYSQL数据库

    FIREDAC驱动MYSQL数据库 FIREDAC连接MYSQL数据库需要用到LIBMYSQL.DLL这个动态库. 这个LIBMYSQL.DLL分为32位和64位两个不同的版本,对应32位或64位的M ...

  8. JAVA常见算法题(十五)

    package com.xiaowu.demo; /** * * 输入三个整数x,y,z,请把这三个数由小到大输出. * * @author WQ * */ public class Demo15 { ...

  9. sed命令使用示例

    sed -i '/mirrorlist/d' CentOS-Base-163.repo 把有mirrorlist的行删除sed -i '/\[addons\]/,/^$/d' CentOS-Base- ...

  10. WEB安全漏洞与防范

    1.XSS 原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.如,盗取用户Cookie信息.破坏页面结构.重定向到其 ...