------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.C语言的数据类型
基本类型
构造类型
指针类型 *
空类型 void
2.输入输出函数
printf(格式控制字符串,输出列表) //格式控制字符串可由格式字符串(以%开头)和非格式字符串(原样输出)组成.
scanf(格式控制字符串,地址表列)
putchar() //字符数据的输出 等同与 printf(%c,.) 位于<stdio.h>中
getchar() //从键盘输入中读取一个字符。scanf(%c,&mchar)
3.逻辑运算
4.二维数组
定义: 类型说明符 数组名[常量表达式1][常量表达式2]
注:a.存储器单元是一维线性排列的。是按行存放的。
5.字符数组
c中没有字符串数据类型,是用字符数组来表示字符串变量的。字符串总是以'\0'作为串结束符,所以,字符串就是一种以‘\0’结束的字符数组。
注:在求字符串长度时,不包含结束符'\0'。但是sizeof却要包含。如:
char c[]="string";
char c1[]={'s','t','r','i','n','g','\0','\0'};
printf("%d\n",sizeof(c)); // 7 ,默认在string后加'\0'
printf("%d\n",sizeof(c1)); //8,对于字符数组只能自己加结束符
printf("%d\n",strlen(c)); //6 求字符串长度时,不包含结束符'\0'
printf("%d\n",strlen(c1)); //6 求字符串长度时,不包含结束符'\0'
常用的字符串处理函数(在stdio.h中与string.h中):
puts(字符数组名)---把字符数组中的字符串输出到显示器。
gets(字符串数组名)--从输入设备得到字符串。
strcat(字符数组名1,字符数组名2)--把字符数组中2中的字符串连接到字符数组1中字符串的后面,并删除字符串1后的串标志"\0";
strcpy(字符数组名1,字符数组名2)--把字符数组2中的字符串复制到字符数组1中,串结束标识'\0'也一同复制。
strcmp(字符数组名1,字符数组名2)--按照ASCII码顺序比较两个数组中的字符串,并由函数返回比较结果。
strlen(字符数组名)---返回字符实际长度(不含字符'\0')
6.函数
对于被调用函数的声明和函数一般形式:类型说明符 被调函数名(类型,类型,..);
注:如果被调用函数的返回值是整型或字符型时,可以不对被调用函数作说明而直接调用。
7.变量的作用域及存储特性
a.局部变量:又称内部变量。在函数内作定义说明,其作用域仅限于函数内。
b.全局变量:又称外部变量,它是在函数外部定义的变量。它不属于哪一个函数,而属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。只有在函数中经过说明的全局变量才能使用,说明符为:extern.但是在一个函数之前定义的全局变量,在该函数内可以再加以说明。
变量的存储特性:
a.auto(自动变量)默认。为动态存储,既只有在使用它才分配存储单元,开始它的生命周期。
b.extern(外部变量)
c.static(静态变量) 为静态存储方式,可分为静态局变量和静态全局变量。
如:在一个函数 f() { static int a,b;
d.寄存器变量(register).当一个变量反复访问时,就可将此变量声明为register。放在cpu的寄存器中。别注:只有局部自变量和形式参数才能定义为寄存器变量。使用个数很有限。对于Truboc 、MS C等使用是按自动变量处理的。
8.内部函数和外部函数
9.指针变量声明
10.指针运算
a.指针赋值: 如:int x; int *p=&x;
注意:在没赋初值时,指针变量的内容是不确定的。如果此时引用指针指向的变量,将会产生不可预料的后果。 如:int *p; *p=100; //错误,p没有初始化。
b.指针的加减:指针变量加1不能是简单的地址加1,加上一sizof(指针变量所指类型)。
两个指针变量在指向同一存储区域(数组)的元素时,可以进行相减。其差绝对值表示两指针元素之间相差的元素个数。
11.指针与一维数组
注:c语言中规定,数组名代表第一个元素的地址,是指针常量。数组a的首地址可用&a[0]表示,或a表示。
12.动态申请存储空间
13.预处理
指在进行编译的第一遍扫描(词法扫描、语法分析、代码生成、代码优化)之前所做的工作。C中是由预处理程序负责完成。
当对一源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理,处理完毕后自动对源程序进行编译,将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。(在C中如宏定义、文件包含、条件编译等为预处理)。
宏定义:不带参数的宏定义 #define 标识符字符串
14.文件包含
15.条件编译
希望部分行在满足一定条件才进行编译,即按不同的条件去编译不同的程序部分,因而产生不同的目标代码条件。使用条件编译功能,为程序的调试和移植提供了有力的机制,使程序可以适应不同系统和硬件设置的通用性和灵活性。
#ifdef 标识符
#else
#endif
例:
16.指针型函数
指函数返回指针值的函数。格式: 类型说明符 *函数名([参数列表]){}
17.指向函数的指针
例:
要注意区分定义语句int(*p)()和int *p()。这类组合说明符遵循“从里到外,先右后左”的规则。
对于int(*p)() 的阅读顺序是:从标识符*p开始,说明*p是一个指针变量,它指向一个函数(先读右边),它返回int类型(再读左边)。
对于int *p(),从标识符p开始,p是一个函数(先读右边),返回值为类型为int *(再读左边),即它是一个指针型函数。
18.二维数组和指针
19.指向二维数组中一行元素的指针
数据类型(*指针名)[N]
例:int a[3][4], int (*p)[4]; 这里p是一个指针变量,它指向包含4个整型元素的一维数组。可以进行p=a初始化。但是不能p=&a[0][0],因为数组名a是指针常量,它的基类型是包含4个整型元素的一维数组,与行指针变量p的基类是一样的。但是a[0][0]是数组中的一个元素,它的基类是整型。所以不能将引地址赋给p.
转载:blog.sina.com.cn/s/blog_5632ed9f0100dq5b.html~type=v5_one&label=rela_nextarticle
20.指针数组
可以使若干个行指针分别指向二维数组中的每一行,把这些指指针存放在一个数组中,称为指针数组。
指针数组的定义形式为: 类型说明符 *数组名[常量] 例:char *p[10]; 按照右结合的原则,p先与[10]结合,说明了是数组的形式,它有10个元素,p[10]再与前面的*结合,表示数组p[10]是一个指针变量,即每一个数组元素都是一个指针变量,现由左面的类型char,可知指针数组中的每一个指针变量都指向一个字符串。
例如:将"china","india","japan","america","canada"按字母顺序(由小到大)输出。
#include <stdio.h>
#include<string.h>
void sort(char *a[],int n)
{
char *temp;
int i,j,p;
for(i=0;i<n;i++)
{
}
}
main()
{
}
21.二级指针
是指向一级指针的指针。即二级指针中存放的是一级指针的地址。
定义: [存储形式] 数据类型 **指针名;
例:int a,*p,**q;
例:char *name[]={"china","india","japan","american","canada"};
22.指针数组作main函数的形参
定义:main(int argc,*argv[]) 或 main(int argc,**argv); 其中argc是命令行中的参数个数(可执行文件名本身也算一个)argv是一个指向字符串的指针数组,用来存放命令行中各个参数的首地址。
23.结构体
结构体的引用:结构体变量名.成员名 如:stud1.num = 101;
24.typedef的使用方法
利用某个已有的数据类型定义一个新的数据类型。格式:typedef 数据类型或数据类型名新数据类型名
例如: typedef float REAL;
有了上定义后就可以用如下的定义方式如:REAL f1,f2;
注意:a.typedef没有创造新的数据类型,它是用来定义类型,不能定义变量。
25.结构体数组
数组元素是结构体类型的数组。
例:struct person{
26.指向结构体的指针
说明一个结构类型的变量后,它就在内存获得了存储区,该存储区的起始地址,就是这个变量的地址(指针)。如果说明一个这种结构类型的指针变量,把结构类型变量的地址赋给它,这个指针就指向这个变量了。
结构体指针变量定义的一般形式:struct 结构体名 *指针变量名; 例:struct student *p;
用指针变量访问结构变量成员的方法:1).直接利用结构变量: 结构变量名.成员名
#include<stdio.h>
#include<string.h>
void main()
{
struct student{
}stu_1,*p;
p = &stu_1;
stu_1.num = 89101;
strcpy(stu_1.name,"li li");
p->sex = 'M';
p->score= 89.5;
printf("\nNum:%ld\nname:%s\nsex:%c\nscore:%f\n",(*p).num,p->name,stu_1.sex,p->score);
}
27.共同体
由若干个不同类型的数据项组成,但共享同一存储空间的结构类型。(与结构体的区别是:结构体类型变量的每一个成员都占有各自的存储区,而共同体类型变量的所有成员共用一个存储区。常称它是一种可变身份的数据类型,可在不同的时候在同一存储单元中存储不同类型的变量。)
例:#include<stdio.h>
union u{
char u1;
int u2;
};
main()
{
union u a ={0x9843};
printf("1.%c %x\n",a.u1,a.u2);
a.u1 = 'B';
printf("2.%c %x\n",a.u1,a.u2);
28.枚举类型
它的值有固定的范围(如一年只有12个月),这些值可以用服限个常量来描述。格式:
enum weekday{
Mon = 1,
Tue,
Wed,
Thu,
Fri,
Sat,
Sun
};
char *name[8] ={"error","Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
void main()
{
enum weekday d;
printf("请输入今天的数字(1-7):\n");
scanf("%d",&d);
if(d>0&&d<7)
else if(d==1)
else
if(d) printf("明天是%s\n",name[d]);
else
}
29.文件类型指针
在c语言中有一个FILE类型,它是存放有关文件信息的结构体,FILE类型结构在stdio.h定义,如下:
定义文件类型指针: FILE *fp;
30.文件的打开和关闭
文件的打开:
文件名是打开文件的文件名,它可以是字符串常量或者字符数组。 打开方式:指文件的类型和操作要求。
注:a.r(read)、w(write)、a(append)、t(text)、b(binary)、+(读写).
例:FILE *fp;
文件的关闭:fclose(文件指针);
31.文件的读写
a.字符输入/输出函数
写字符函数fputc()---将一个字符写入指定的文件中,其调用格式为:fputc(字符量,文件指针);
读字符函数fgetc()---从指定的文件中读取一个字符,其调用格式:字符变量 = fgetc(文件指针);
b.文件字符串输入/输出函数
从指定的文件中读出一个字符串到字符数组中,格式:fgets(字符数组名,n,文件指针); //表示从文件中读出的字符串不超过n-1个字符。字符最后一个字符前加上串标志'\0'.读取过程中若遇到换行符或者文件结束符(EOF),则读取结束。
写字符串函数:fputs(字符串,文件指针); //字符串可以是字符常量,也可以是字符数组。
c.数据块输入/输出函数
数据块读函数fread(p,size,n,fp); p指向要要输入/输出数据块的首地址的指针;size:某类型数据存储空间的字节数;n:此次从文件中读取的数据项数。fp:文件指针变量
数据块写函数fwrite(p,size,n,fp);
例:
d.字输入/字输出
putw(w,fp)---将整型数w写入fp所指的文件(以写方式打开的二进制文件).w是要输出的整型数据,可以是常量或变量
getw(fp) ---从fp所指向的文件中读取一个整型数。
32.文件的定位
rewind(文件指针)---重置文件位置指针到文件开头。
fseek(文件指针,位移量,起始位置); 位移量:指被移动的字节数,大于0表示新的位置在初始值的后面。小于0表示在新的位置在初始值的前面。起始位置:0(文件开始处)、1(当前位置)、2(文件末尾处)
ftell(文件指针)---返回当前指针位置。