易截截图软件、单文件、免安装、纯绿色、仅160KB
热门标签: c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 最新文章 :

如何写出优美的 C 代码


级别: 初级
邱 俊涛
(juntao.qiu@gmail.com
), 软件工程师, Jinfonet
2009 年 9 月 25 日
面向对象的语言更接近人的思维方式,而且在很大程度上降低了代码的复杂性,同时提高了代码的可读性和可维护性,传统的 C 代码同样可以设计出比较易读,易维护,复杂度较低的优美代码,本文将通过一个实际的例子来说明这一点。
基础知识
结构体
除了提供基本数据类型外,C 语言还提供给用户自己定制数据类型的能力,那就是结构体,在 C 语言中,你可以用结构体来表示任何实体。结构体正是面向对象语言中的类的概念的雏形,比如:
typedef struct{
float x;
float y;
}Point;
定义了一个平面坐标系中的一个点,点中有两个域,x 坐标和 y 坐标。
结构体中的域称为结构体的成员
。结构体中的数据类型可以是简单数据类型,也可以是其他的结构体,甚至结构体本身还可以嵌套,比如,一个标准的链表结构可以进行如下定义:
typedef struct node{
void *data;// 数据指针
int dataLength;// 数据长度
struct node *next;// 指向下一个节点
}Node;
可以看到,结构体 node 中的 next 指针的类型又是 node 类型。
函数指针
指针是 C 语 ......

我的C实践(2):联合的妙用

    在C语言中,联合类型是一种比较特殊的类型,其多个成员共享一个存储区(为最大成员的长度),一次只能包含一个成员值,会进行内存对齐。对联合类型进行sizeof运算会包括所有成员所需要的存储空间量,还包括成员间和成员后面的填充空间。联合类似于其他语言中的“变体记录”,如果联合的长度很大或者有大量的联合,则可以大大节省存储空间。
    1、联合只能一次赋值一个成员,并使用它,但C语言没有提供查询联合上一次赋值所用成员的方法。我们可以定义一个enum,其中各个枚举常量代表union各个成员的标志。然后把union和这个enum封装在一个struct中,当对union的某个成员赋值时,就设置相应的标志,这样就可以跟踪联合的成员赋值。
/* widget.c:用枚举常量来跟踪联合类型的成员赋值 */
#include <stdio.h>
#include <string.h>
enum widget_tag{ /* 联合的各个成员的标志 */
count_widget,
value_widget,
name_widget
};
struct WIDGET{ /* 把union和enum封装在一个struct中 */
enum widget_tag tag;
union{
long count;
double value;
char name[10];
} data;
} x;
typedef stru ......

如何理解c和c ++的复杂类型声明(转)


 
如何理解c
和c ++
的复杂类型声明(转)
曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) )
[10];
这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++
声明。
  我们将从每天都能碰到的较简单的声明入手,然后逐步加入const
修饰符和typedef
,还有函数指针,最后介绍一个能够让你准确地理解任何C/C++
声明的“
右左法则”

  需要强调一下的是,复杂的C/C++
声明并不是好的编程风格;我这里仅仅是教你如何去理解这些声明。注意:为了保证能够在同一行上显示代码和相关注释,本文最好在至少1024x768
分辨率的显示器上阅读。
让我们从一个非常简单的例子开始,如下:
int n;
这个应该被理解为“declare n as an int”
(n
是一个int
型的变量)。接下去来看一下指针变量,如下:
int *p;
这个应该被理解为“declare p as an int *”
(p
是一个int *
型的变量),或者说p
是一个指向一个int
型变量的指针。我想在这里展开讨论一下:我觉得在声明一个指针(或引用)类型的变量时,最好将*
(或&
)写在紧靠变量之前,而不是紧跟基本类型之后。这样可以避免一 ......

长期收集 C/C++ FAQ

写在前面:
  论坛里总有那么一些问题是长盛不衰的,今天这个问,明天那个问,到历史帖子里一搜可以抓出来一大把。有时候这都令我怀疑是不是我们的教育体制存在问题……
  于是我开了这篇文章,搜集我见到的长生不老之帖,希望可以起到参考价值。
  这里使用的编译环境为 gcc/g++ 4.3.3 for ubuntu 9.04
数组名和指针的问题
  这绝对是教材问题!现在国内有太多教材灌输“数组名相当于指针”的概念了!于是纷纷有人把数组名和指针等同起来,认为数组名其实就是一个指针。久而久之,许多新手已经不知道还有一种数据类型叫做“数组”了。
  对于这个问题首先应该从概念上澄清,坚定不移地把数组和指针这两种类型划清界线,认识到它们虽然有千丝万缕的联系,但其实是两种不同的数据类型。就如下面所看到的:
#include <iostream>
#include <typeinfo>
using namespace std;
#define gettype(id) (cout<<typeid(id).name()<<endl)
int a;
char arrChar[10];
char str1[] = "string";
char str2[] = "string?";
char *p1 = str1;
char *p2 = str2;
int main()
{
gett ......

长期收集 C/C++ FAQ

写在前面:
  论坛里总有那么一些问题是长盛不衰的,今天这个问,明天那个问,到历史帖子里一搜可以抓出来一大把。有时候这都令我怀疑是不是我们的教育体制存在问题……
  于是我开了这篇文章,搜集我见到的长生不老之帖,希望可以起到参考价值。
  这里使用的编译环境为 gcc/g++ 4.3.3 for ubuntu 9.04
数组名和指针的问题
  这绝对是教材问题!现在国内有太多教材灌输“数组名相当于指针”的概念了!于是纷纷有人把数组名和指针等同起来,认为数组名其实就是一个指针。久而久之,许多新手已经不知道还有一种数据类型叫做“数组”了。
  对于这个问题首先应该从概念上澄清,坚定不移地把数组和指针这两种类型划清界线,认识到它们虽然有千丝万缕的联系,但其实是两种不同的数据类型。就如下面所看到的:
#include <iostream>
#include <typeinfo>
using namespace std;
#define gettype(id) (cout<<typeid(id).name()<<endl)
int a;
char arrChar[10];
char str1[] = "string";
char str2[] = "string?";
char *p1 = str1;
char *p2 = str2;
int main()
{
gett ......
总记录数:40319; 总页数:6720; 每页6 条; 首页 上一页 [6711] [6712] [6713] [6714] [6715] [6716] [6717] [6718] [6719] 6720  下一页 尾页
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号