分类: 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
条件编译:有三种:#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的小认识学习!再细化点学习,我们还要去学习,去实践,才能更易明白和掌握!