Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130649
  • 博文数量: 36
  • 博客积分: 2092
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-04 17:33
文章分类
文章存档

2011年(18)

2010年(18)

我的朋友

分类: C/C++

2010-05-09 12:56:36

C语言的头文件中包括了各个标准库函数的函数原型。因此,凡是在程序中调用一个库函数时,都必须包含该函数原型所在的头文件。

当有多个量时,用逗号间隔。printf("sine of %lf is %lf\n",x,s);其中%lf为格式字符,表示按双精度浮点数处理。它在格式串中两次现,对应了x和s两个变量。其余字符非格式字符则照原样输出在屏幕上!
但是必须注意, 求值顺序虽是自右至左,但是输出顺序还是从左至右, 因此得到的结果是上述输出结果。

d                 以十进制形式输出带符号整数(正数不输出符号)
o                 以八进制形式输出无符号整数(不输出前缀O)
x                 以十六进制形式输出无符号整数(不输出前缀OX)
u                 以十进制形式输出无符号整数
f                 以小数形式输出单、双精度实数
e                 以指数形式输出单、双精度实数
g                 以%f%e中较短的输出宽度输出单、双精度实数
c                 输出单个字符
s                 输出字符串

scanf ("%d%d",&a,&b);// 不要写成scanf ("%d,%d",&a,&b);这样,输入时.也当豆号作比较;除非在输入时也写上豆号!
如果格式控制串中有非格式字符则输入时也要输入该非格式字符。

在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。

赋值语句:变量=表达式;

输入设备—键盘上输入数据的函数有:printf和putchar(?)。
输入设备—键盘上输入数据的函数有:scanf和?=getchar()。

a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0],a[1],a[2],a[3],a[4]。

C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储!

字符串:二种方式 ,对字符数组作初始化赋值,必须采用外部类型或静态类型,如: static char st[]={“C Language”};而对字符串指针变量则无此限制,如:static/ char *ps="C Language"; 这里应说明的是并不是把整个字符串装入指针变量, 而是把存放该字符串的字符数组的首地址装入指针变量。

函数指针与指针函数:int *func(void)与int (*func)(void)的区别,前者是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。返回整型指针型函数;后者是函数指针,说明是一个指向函数入口的指针变量,该函数的返回值是整型量,

一旦函数被定义为空类型后(void), 就不能在主调函数中使用被调函数的函数值了

指针数组说明的一般形式为: 类型说明符*数组名[数组长度] 例如: int *pa[3] 表示pa是一个指针数组,它有三个数组元素, 每个元素值都是一个指针,指向整型变量。

指向指针的指针变量说明的一般形式为:类型说明符** 指针变量名;int x,*p,**pp;p 是一个指针变量,指向整型量x;pp也是一个指针变量, 它指向指针变量p。通过pp变量访问x的写法是**pp。

与指针有关的各种说明和意义见下表。
int *p;     p为指向整型量的指针变量
int *p[n];   p为指针数组,由n个指向整型量的指针元素组成。
int (*p)[n];  p为指向整型二维数组的指针变量,二维数组的列数为n
int *p()    p为返回指针值的函数,该指针指向整型量
int (*p)()   p为指向函数的指针,该函数返回整型量
int **p     p为一个指向另一指针的指针变量,该指针指向一个整型量。

结构体:
struct 结构名                  相当于             claa 类名        这可加私有或公有或者保护
{                                                 {  
成员表列                                             成员表列  
/再嵌入一个结构体:struct 结构名n 成员;
}/结构名1...n;                                                 };
结构变量成员的一般形式是: 结构变量名.成员名 例如:boy1.num ;
如果成员本身又是一个结构则必须逐级找到最低级的成员才能使用,例如:boy1.birthday.month

枚举:
enum 枚举名
{ 枚举值表 }枚举名1...n;                   只有同类的枚举名才能访问同类的枚举值;如果不是,可以用强制:(enum 枚举名)来转换

位运算符C语言提供了六种位运算符,使得C语言也能像汇编语言一样用来编写系统程序:
& 按位与         双目            参与运算数仍以补码出现, 只有对应的两个二进位均为1时,结果位才为1
| 按位或         双目            参与运算数仍以补码出现, 只要对应的二个二进位有一个为1时,结果位就为1
^ 按位异或       双目            参与运算数仍以补码出现, 只要当两对应的二进位相异时,结果为1。
~ 取反           单目
<< 左移          双目            其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,
                                 高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后                                   为00110000(十进制48)。
>> 右移          双目            其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
                                 例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在                                 右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1                                  取决于编译系统的规定。

位域:
位域列表的形式为: 类型说明符 位域名:位域长度
struct 位域结构名
{ 位域列表 }/位域名;
位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。
注:一个位域必须存储在同一个字节中,不能跨两个字节,也就是说不能超过8位二进位。
位域在本质上就是一种结构类型, 不过其成员是按二进位分配的,是以二进制位为单位进行运算的。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}

类型定义符(取别名):typedef
typedef定义的一般形式为: typedef 原类型名 新类型名; 其中原类型名中含有定义部分,新类型名一般用大写表示, 以便于区别。在有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。
如:
typedef struct
{
char name[20];
int age;
char sex;
} STU;
定义STU表示stu的结构类型,然后可用STU来说明结构变量: STU body1,body2;
又如:
typedef char NAME[20]; 表示NAME是字符数组类型,数组长度为20。
然后可用NAME 说明变量,如: NAME a1,a2,s1,s2;完全等效于: char a1[20],a2[20],s1[20],s2[20]


预处理:也就有三种
宏;包涵文件;条件下处理
“宏”分为有参数和无参数两种:

“宏”分为无参数格式(可以上种简单替换):#define 标识符 字符串 (可用#undef来终止此作用 #undef 标识符)
应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。请看下面的例子: #define PIN1 int* 和typedef (int*) PIN2;从形式上看这两者相似, 但在实际使用中却不相同。下面用PIN1,PIN2说明变量时就可以看出它们的区别:   PIN1 a,b;在宏代换后变成 int *a,b;表示a是指向整型的指针变量,而b是整型变量。然而:PIN2 a,b;表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型,但毕竟是作字符代换。在使用时要分外小心,以避出错。

带参宏定义的一般形式为: #define 宏名(形参表) 字符串 在字符串中含有各个形参!参数两边的括号是不能少的。

文件包含二种方式:#include和#include"math.h" 使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的                 ), 而不在源文件目录去查找; 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。 用                 户编程时可根据自己文件所在的目录来选择某一种命令形式。

条件编译:有三种:#ifdef 标识符 .程序段1 #else . 程序段2 #endif 可以写成:#ifdef 标识符 .程序段1 #endif
                #ifndef 标识符 .程序段1 #else . 程序段2 #endif
                #if 常量表达式 .程序段1 #else . 程序段2 #endif
第一种:如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。
第二种:如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。这与第一种形式的功能正相反。
第三种:如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。


文件的操作都是由库函数来完成的!
文件指针在C语言中用一个指针变量指向一个文件, 这个指针称为文件指针。格式:FILE* 指针变量标识符;例如:FILE *fp;
文件打开函数fopen,形式为: 文件指针名=fopen(文件名,使用文件方式) ; 如:FILE *fp;fp=("file a","r");
文件使用方式        意 义
“rt”      只读打开一个文本文件,只允许读数据
“wt”      只写打开或建立一个文本文件,只允许写数据
“at”      追加打开一个文本文件,并在文件末尾写数据
“rb”      只读打开一个二进制文件,只允许读数据
“wb”       只写打开或建立一个二进制文件,只允许写数据
“ab”       追加打开一个二进制文件,并在文件末尾写数据
“rt+”      读写打开一个文本文件,允许读和写
“wt+”      读写打开或建立一个文本文件,允许读写
“at+”      读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+”      读写打开一个二进制文件,允许读和写
“wb+”      读写打开或建立一个二进制文件,允许读和写
“ab+”      读写打开一个二进制文件,允许读,或在文件末追加数据

对于文件使用方式有以下几点说明:
1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read): 读
w(write): 写
a(append): 追加
t(text): 文本文件,可省略不写
b(banary): 二进制文件
+: 读和写
若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。

文件关闭函数fclose,形式是: fclose(文件指针); fclose(fp); 正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。

在C语言中提供了多种文件读写的函数:
·字符读写函数 :fgetc和fputc 形式为: 字符变量=fgetc(文件指针); /fputc(字符量,文件指针);
·字符串读写函数:fgets和fputs 形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数 / fputs(字符串,文件指针);
·数据块读写函数:freed和fwrite 形式为: fread(buffer,size,count,fp); / fwrite(buffer,size,count,fp);
·格式化读写函数:fscanf和fprinf 形式为: fscanf(文件指针,格式字符串,输入表列);/ fprintf(文件指针,格式字符串,输出表列);

说明:
    数据块读写函数中的buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。
                    例如:fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。

    字符串读写函数:例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。
                    例如:fputs(“abcd“,fp);其意义是把字符串“abcd”写入fp所指的文件之中。[例10.5]在例10.2中建立的文件string中追加一个字符串。

格式化读写函数:例如:fscanf(fp,"%d%s",&i,s);
                      fprintf(fp,"%d%c",j,ch);

其实以上都是一些概念,对菜鸟我对C的小认识学习!再细化点学习,我们还要去学习,去实践,才能更易明白和掌握!

阅读(1285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~