真正深入学习C语言已经3年有余了。不过还是有很多知识点没有记下来,在此总结一下,也帮助C语言新手度过新手难关。

如果你已经认真阅读过谭浩强C,那么复习如下知识大约需要1个小时:)

本篇是《帮你度过C语言新手阶段》系列的最后一篇。

第三十五关:

char *a;

scanf(”%s”,a);

上述程序是绝对禁止的,是错误的。正确的写法如下:

char *a,str[10];

a=str;

scanf(”%s”,a);

第三十六关:

用指针变量来指向一个格式字符串,可以用它来代替printf函数中的格式字符串,如:

char *format;

format=”a=%d,b=%f\n”;

printf(format,a,b);

其实format也可以定义为char format[]形式,但不建议,因为用指针的话,可以很方便指向另一个格式字符串。

第三十七关:

声明一个指向函数的指针:int (*p)(); 定义p是一个指向函数的指针变量,此函数带回整型的返回值。

所以定义指向函数的指针时,只需要注意返回值相匹配即可,而形参部分不需要考虑。

注意,如果写成int *p();由于()的优先级高于*,就变成了声明一个函数,它的返回值是指向整型的指针。

使用p的方法:

int max(int a, int b);

p=max;

num=(*p)(3,5);

在一个程序中,一个指针变量可以先后指向返回类型相同的不同函数。

第三十八关:

用指向函数的指针做函数参数:

sub(int (*x1)(int),int (*x2)(int,int));

这里的参数列表可以选择不写(不推荐此种写法),即sub(int (*x1)(),int (*x2)());,不过如果写参数,就必须要写全写正确。

虽然C允许在参数中用()省略掉形参表,但是,从一个良好的程序风格来看,还是应当禁止这样的使用。

第三十九关:

指针数组的定义:

char *name[]={”follow me”,”basic”,”great wall”,”fortran”,”computer”};

name代表该指针数组的首地址,name+i是name[i]的地址。

程序举例:

char *name[]={”follow me”,”basic”,”great wall”,”fortran”,”computer”};

char **p;

int i;

for (i=0;i<5;i++){

p=name+i;

printf(”%s\n”,*p);

}

第四十关:

struct定义一定不要忘了最后的分号:

struct 结构体名

{成员列表};

在引用结构体变量的域时,*p.num相当于*(p.num),因为.的优先级是最高的!

第四十一关:

共用体的定义为:

union 共用体名称

{

成员列表;

}变量列表;

例如:

union data

{

int i;

char ch;

float f;

}a,b,c;

共用体变量所占的内存长度是最长的成员的长度。

在引用共用体变量时应十分注意当前存放在共用体变量中的究竟是哪一个成员。

&a、&a.i、&a.ch、&a.f都是同一个地址值。

不能对共用体变量名赋值,也不能企图引用变量名得到一个值,更不能在定义共用体时对它初始化。

第四十二关:

声明枚举类型的举例:

enum weekday{sun,mon,tue,wed,thu,fri,sat};

声明了枚举类型之后,就可以用枚举类型来定义变量:

enum weekday workday,weekend;

对于枚举元素,C语言编译时的顺序使它们的值为0,1,2…

workday=mon;

printf(”%d”,workday);

则会显示1

当然你可以改变这种现状:

enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}workday,weekend;

此时,sun=7,mon=1,tue=2…以此类推

一个整数不能直接赋值给一个枚举变量,而要先进行类型转换:

workday=(enum workday)2;

第四十三关:

用typedef声明结构体类型:

typedef struct

{

int month;

int day;

int year;

}DATE;

这样就声明了新的类型DATE,然后就可以用DATE来声明结构体变量了。如DATE birthday;DATE *p;

用typedef声明数组类型:

typedef int NUM[100];

然后就可以用NUM来定义数组变量:

NUM n;

第四十四关:

C语言的位运算有6个运算符:

1 与&

2 或|

3 异或^

4 取反~

5 左移<<

6 右移>>

位运算的运算量只能是整型或字符型,不能是其他类型,否则会报错。

按位与:用于清零或提取某一位

按位或:用于置1

异或:用于交换两个整型值或两个字符型值。如a=a^b;b=b^a;a=a^b;

取反:令最低位置1。如a=a&~1。此方法适用于在32位和64位机之间兼容。

左移:相当于乘以2,右补0。

右移:如果首位为0,则左补0;如果首位为1,则分为逻辑右移和算术右移两种情况。

逻辑右移:左补0

算术右移:左补1

第四十五关:

位段的概念非常重要,在编写网络程序常会用到。

struct packet_data

{

unsigned a:2;

unsigned b:6;

unsigned c:4;

unsigned d:4;

int i;

}data;

当然也可以不恰好占满一个字节,如

struct packet_data

{

unsigned a:2;

unsigned b:3;

unsigned c:4;

int i;

}data;

这样的话a,b,c会占去2字节中的前9位,而后7位会空闲下来,而i会从另一个新字节开头开始。

在引用位域时,要特别注意其最大值范围,如占2位,那么最大值为3.

位段成员的类型只能指定为unsigned int或int型。

若要强制一个域从新字节开始,那么可以这样:

unsigned a:1;

unsigned b:2;

unsigned :0;

unsigned c:3;

此时c会从一个新字节开始存储。

位段可以用%d来输出。

可以定义无名位段,表示这些位我不用:

unsigned a:1;

unsigned :2; //这两位空间我不用

unsigned c:3;

第四十六关:

在缓冲文件系统中,有一个概念叫做“文件指针”。

在stdio.h中有关FILE结构体类型的声明:

typedef struct

{

short level;    //缓冲区满或空的程度

unsigned flags;    //文件状态标志

char fd;    //文件描述符

unsigned char hold;    //如无缓冲区不读取字符

short bsize;    //缓冲区的大小

unsigned char *buffer;    //数据缓冲区的位置

unsigned char    *curp;    //指针、当前的指向

unsigned istemp;    //临时文件,指示器

short token;    //用于有效性检查

}FILE;

可见,其实FILE也是一个由typedef定义过的类型,其本质是一个结构体类型,其中有很多域,存储着和这个文件相关的各种各样的信息。

在进行文件读写操作时,建议不要使用fprintf和fscanf函数,而尽量使用fread和fwrite函数。

over~

C语言位于30到100之间的一个奇数,《帮你度过C语言新手阶段》系列之三相关推荐

  1. 用perl语言求1到100之间的偶数,奇数及素数

     一.求1到100之间的偶数: #!/usr/bin/perl -w for (1..100){ if (($_%2 eq 0)){ print "$_ "; } } 二.求1到1 ...

  2. (c语言)输出1到100之间的所有素数

    (c语言)输出1到100之间的所有素数(函数实现) 方法一: //输出1-100之间的所有素数要求编写函数(函数实现) #include<stdio.h> #include<stdl ...

  3. 求一到一百的总偶数奇数总数和的C语言程序,C语言程序求1—100之间的奇数和和偶数和...

    点击查看C语言程序求1-100之间的奇数和和偶数和具体信息 答:用oddsum=1+3+5+···+99来计算奇数和:evensum=2+4+6+···+100来计算偶数和.首先设置两个计数器:odd ...

  4. java语言打印1到10的偶数_#Java编程# 编写一个应用程序创建两个线程,一个线程打印输出1~100之间所有的奇数,另外一 求写一个用JAVA求1~...

    import java.util.Random; class A extends Thread { \tint i=1; \tRandom r=new Random(); \tpublic void ...

  5. 打印20以内的素数c语言,c语言编程输出2~100之间的所有素数(每行输出10个),并将它们打印出来....

    C语言编程实现计算1到100之间的奇数之和 你好,可以这样编程]#includeintmain(){inti,sum=0;//定义循环变量和存放求和的变量sumfor(i=1;i C语言:用for循环 ...

  6. C语言之1到100之间偶数之和与奇数之和

    #include <stdio.h> int main(void) {     int i;     int sum1 = 0;     int sum2 = 0;          fo ...

  7. 关于累加偶数奇数的c语言程序,C语言程序求1—100之间的奇数和和偶数和

    满意答案 RZCK 2013.11.13 采纳率:51%    等级:12 已帮助:8607人 1到100之间的奇数的和与偶数的和,也就是说1到100所有的奇数相加显并示出来,再把1到100所有的偶数 ...

  8. c语言的文案,点心回顾 | 这是一个充满有趣灵魂的C语言乐园!

    原标题:点心回顾 | 这是一个充满有趣灵魂的C语言乐园! 2018年12月11日下午,由嵌入式技术协会承办第十八届社团文化节之"C乐园"C语言程序设计竞赛圆满结束,让我们一起回顾一 ...

  9. c语言两字符串转数字后相加,一个觉得很难的C语言问题。对两个数字字符串相加。 C语言 如何把一个字符串中相连的两个数字转化为一......

    导航:网站首页 > 一个觉得很难的C语言问题.对两个数字字符串相加. C语言 如何把一个字符串中相连的两个数字转化为一... 一个觉得很难的C语言问题.对两个数字字符串相加. C语言 如何把一个 ...

最新文章

  1. php 挂马 密码123456,admin密码-常用密码加密md5值,123456,admin,admin888
  2. 从javascript发展说到vue
  3. sap abap 对字符串的操作
  4. 2020年信息系统项目管理师真题讲解:基础知识1/3
  5. mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...
  6. RTOS原理与实现13(完):内核裁剪与移植
  7. stl sort分析
  8. 075 json和pickle模块
  9. 机械秒表的使用方法_秒表的使用方法?
  10. 谷歌5款插件推荐:谷歌工具类、翻译类扩展程序
  11. Activity重建之殇
  12. TypeError: Animal() takes no arguments
  13. 内存、外存、硬盘、磁盘、闪存,傻傻分不清?
  14. 3.JAVAEE-电子商城-用户管理模块
  15. 暑假集训 T3 与非
  16. 【C语言进阶】常见数据格式转换处理的代码实现
  17. Day 07 类、魔方方法
  18. 中级软考有没有必要考?
  19. 二手交易管理系统SSM
  20. 碧桂园香港上市 25岁杨惠妍512亿身家变身首富

热门文章

  1. [微信小程序直播平台开发]___(一)介绍与流程
  2. wait/waitpid函数与僵尸进程、fork 2 times
  3. 升级Hbase,解决bug问题
  4. 解读阿里云oss-android/ios-sdk 断点续传(多线程)
  5. 《单页Web应用:JavaScript从前端到后端》——1.4 小结
  6. 微信小程序电商系统省市区选择器(二)
  7. rocksdb和leveldb的bloom filter比较
  8. 局域网(LocalAreaNetwork;LAN)
  9. C# 模拟键盘操作SendKey(),SendKeys()
  10. Quartz.NET