yhs[]={1,2,3,4,5};虽然没给出数组大小,但是编译器会根据后面的大括号得到大小的。
查找和排序(数据结构里面详细实现)
1,最笨的顺序查找
2,折半查找,它的前提是数据是按一定的大小规律排好了的。三个变量top,mid,bot。mid=(top+bot)/2;如果mid比x大,那么下一个bot就是mid-1;如果小呢top就是mid+1;直到mid==x。
3,冒泡排序,若有数组中有N个数据,则第i轮比较与交换的次数为(N-i)次,一共进行(N-1)次比较与交换。
for(i=0;i<=N-2;i++) //N-1轮
{
for(j=0;j<=N-i-1;j++) //第i轮比较n-i次
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
字符串
初始化时,char yhs[6]={'C','h','i','n','a','\n'};这种方式当然是可以的,可更方便的是char yhs[6]={"China"};或="China";
更好的是不指定数据大小,让编译器自己确定:char yhs[]="China";
可以看到:最后是有一个'\n'的,所以数组大小要比实际字符多1。
数组中,scanf(),不用&的,因为数组名本身就是一个地址!!
字符串之间是不能进行赋值操作的,只能用复制,strcpy。
二维数组,初始化可以省略第一维的大小,如int a[][6],但是是不能省略第二维的,同样,三维数组中,也可以省第一维。
指针:
如果有int x=10;int *px=&x; &*px怎么说呢?首先,这些一元运算符都是“自右至左结合的”,*px也就是x,又,&x也就是px了,所以,&*px=px。还有,这些运算符优先级低于自增自减运算,*px++是相当于*(px++)的。
指针与小整数的加减:如int *p;pi+1=?,要是pi=212052的话,pi+1=212056的,也就是加一个 int 那么长。所以加的是基类型的长度。
二重指针,如int i=8; *p, **pp; p=&i;pp=&p; 那么*p肯定是等于8的,*pp就是得到p,p是什么,p是i的-地址,所以**p也就是i,即8。
数组和指针,访问数组可以用"下标法"a[i]这样子,也可以用数组名法,*(a+1)这样子,也可以先for(p=a;p<a+5;p++) 输出*p。
一个二维数组名也就是一个二级指针。
二维数组元素的访问:可以通过下标,可以通过一级指针,也可以通过二级指针。
a[i][j]=*(a[i]+j)=*(*(a+i)+j)
指向函数的指针,函数肯定是有一个入口地址的吧,不然主函数怎么能找到它呢,它的名字其实就是入口地址,可以设一个指针,使这个指针的值等于这个入口地址。
这个指针的声明应该是这个样子的: int (*p)();
然后就可以p=fun;了,fun是一个函数名。
然后呢(*p)(a,b)就相当于fun(a,b)了。
当然,函数的返回值也可以是指针。
自己定制的数据类型:结构体,共用体,位域,枚举
结构体可以嵌套定义,当然这样做之后,访问应逐级访问:如A.B.yhs
位段,它在位一级进行操作,也是结构体,只是说里面的元素是这样子的: unsigned int yhs:2;这个2表示是2个bit。
如果,后面又定义了unsigned int :4;它木有位段名,不能用,所以这4个bit就会跳过不用。
如果,后面又定义了unsigned int :6;unsigned int :6;unsigned int :6;一个int 是2字节,16位(不一定都是哈),最后这个6bit怎么放呢,一个位段是不能跨越两个整形空间的,所以最后这个6 bit会重新分配一个空间,从头存放起。
unsigned int yhs:2;unsigned int:0;这样子的语句会跳过其它的位,直接到下一个int空间。
最后呢,看看上面吧,位段只能用unsigned int 或int 的。
结构体数组,不管怎么弄,它还是数组嘛,给它初始化可能是:={{},{},{}};这样子的
指向结构体的指针,定义一个*p,使p=&yhs,(yhs是结构体哈),那么用(*p).name这种方式是可以访问它的成员的,*p就是结构体了嘛。
但是,这种方法不好看,所以,有“->”箭头,它的优先级是灰常高的,灰常高,p->name+1都相当于(p->name)+1,呐,比加还高。
所以,在指针中,用->这个符号是很方便的
共用体,它和结构体的样子是长一样的,只是关键字是union,共用体的空间是按它最大的那个成员分配的。
因为它空间是和最大成员一样的,所以呢,它是不能在定义时像结构体那样初始化的,不然空间肯定是不够的,共用体同一时间 只能存储一个成员,每次引用都是最后一次存入的成员值。
枚举,像这个样子:enum colorname={red,yellow,blue,white,black};然后可以enum colorname color;这个color的取值就只有我们列出的这几种啦,其它的是不合法的。red+1就是yellow了,它们代表了从0到N的数。
文件:
为了读写文件,得有一个指针撒,不然怎么知道读写哪个地方嘛,所以C中有一个FILE类型的指针,FILE是个什么,它是一个结构体,定义在stdio,h里面。
流:对文件操作时,总不能是读一个显示一个或者输入一个写入一个吧,所以要有一个缓冲区,数据都是先到缓冲区里面去的。把这种数据流动就叫“流”
对文件的操作基本都是使用库函数的,打开fopen(文件名,操作方式),关闭fclose()。这两个肯定都会用到撒。
顺序读写:写一个字符,int fputc(),从磁盘取得一个字符,int fgetc(),
写入一个字符串,int fputs(),取得字符串,char *fgets()。
随机读写:int fseek(),移动指针到指定位置,
格式化读写:fprintf()和fscanf(),fprintf()是把数据输出到文件中的,fscanf()把文件里的数据读到缓冲区里。
按“数据块”进行读写:fread()和fwrite()。如fwrite(arr,80,3,fp);表示从数组名arr开始的地址开始,每次输出80B的数据,共输出3次,输出到fp所指向的文件中。
评论