登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

明月凉

再不记录,就忘了

 
 
 

日志

 
 

C语言_基本2  

2011-09-30 16:57:55|  分类: 计算机 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

数组,yhs[10]={1,2,3,4};它后面的其它的元素是自动填0,

           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所指向的文件中。

  评论这张
 
阅读(294)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018