C语言期末复习

什么是计算机语言?

计算机语言可分为机器语言、符号语言和高级语言。高级语言的发展历程:1.非结构化语言(书写规范不严格,难以阅读维护)2.结构化语言3.面向对象语言


C语言之父是Dennis Ritchie,曾因此获得计算机诺贝尔---图灵奖


结构化程序的方法:

(1)自顶向下;

(2)逐步细化;

(3)模块化设计;

(4)结构化编码。


程序=数据结构+算法


127个基本字符用7个二进位存储,如果系统只提供127个字符,那么就将char型变量的第一个二进位设置为0,用后面7位存放0到127个字符的代码。在这种情况下,系统提供的char类型相当于signed char。但实际应用中,往往觉得127个字符不够用,有的系统提供了扩展的字符集。这个时候把char型变量改为unsigned char,可用的字符就扩展为255个。C标准并未规定char是按char 还是signed char处理,由各编译系统决定。


指定数据宽度和小数位数,用%m.nf,这种格式制定了输出的数据占7列,其中包括2位小数。对其后一位采取四舍五入方法处理,即向上或向下取近似值。如果把小数部分指定为0,则不会输出小数及小数点。但注意:有效数字的输出要注意数据类型的精度,如float只能保证6位有效数字。double型数据能保证15位有效数字。

0开头的是八进制

printf提供如下数字格式符:

d格式符。用来输出一个有符号的十进制整数

s格式符。用来输出一个字符串。

f格式符。用来输出单精度浮点数

e格式符。指定以指数形式输出实数。

o格式符。以八进制整数形式输出。

x格式符。以十六进制数形式输出。


在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度

例如:

int a[5]={1,2,3,4,5}可以写成 int a[]={1,2,3,4,5};

对于二维数组初始化的简化可以这样写

int a[3][4]={{1},{0,6}{0,0,11}}

其余部分直接补0;

如果对全部元素都赋初值(即提供全部初始化数据),则定义数组时对1维的长度可以不指定,但第2维的长度不能省。例如:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

与下面的定义等价:

int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};

字符数组初始化时:char c[]=“I am happy”;

请注意,此时数组c的长度不是10,而是11.因为字符串常量的最后又系统加上一个‘\0’


字符数组的输出printf("%s\n",c);输出时,遇结束符'\0'停止

如果利用一个scanf函数输入多个字符串,则应在输入时以空格分隔。例如scanf("%s%s",str1,str2);则输入的两个单词之间用空格隔开,每个单词最后都会加‘

\0’

puts()是将一个以'\0'为结尾的字符串输出到终端。

gets()是从终端输入一个字符串到字符数组,与scanf有所不同的是,gets不以空格作为结尾


strlen()计算的是字符串实际长度,不包括'\0'


在函数声明中的形参名可以省写,而只写形参的类型,如float  add(float,float)

一个递归的问题可以分为“回溯”和“递推”两个阶段。 


数组元素作函数实参时,是“值传递”方式,传递方向是从实参传到形参,单向传递。

用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组数组首元素的地址,编译时把形参数组名处理为一个指针变量,用来接收一个地址。


有时希望函数中的局部变量的值在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次在调用该函数时,该变量,仍是上次调用结束的值,就指定该局部变量为“静态局部变量”,用关键字static进行声明。对于静态局部变量,编译时,自动赋初值0或‘\0’。虽然静态局部变量在调用函数结束后仍然存在,但其他函数是不能引用它的。

static的另外一个用法就是将外部变量的作用域限制在本文件中,比如在file1.c中定义了一个全局变量static int a,但他用了static声明,因此只能用于本文件。虽然在file2.c中extern a,但仍然不能使用file1.c中的全局变量a

static第三个用法就是内部函数的声明,使用内部函数声明可以使函数的作用域只局限于所在文件。外部函数就用extern声明咯,省略的话,系统默认外部函数。


在变量定义点之前的函数不能引用该外部变量。如果由于某种考虑,在定义点之前的函数需要引用该外部变量,则应该在应用之前用extern对该变量作“外部变量声明”,表示把该外部变量的作用域扩展到此位置。所以说啊,一般把外部变量放在最前面就好了嘛,实在不得已在这样哦。


数组元素a[3]其中[]实际上是变址运算符,即将a[i]按a+i计算地址,然后找出此地址单元中的值。

如果指针变量p1和p2如执行p2-p1,结果就是两个地址之差初一数组元素的长度。这个结果是有意义的,表示两个元素之间相差几个元素。两个地址不能相加,因为没有实际意义。


数组名是无法进行a++等运算的,因为它代表数组首元素的地址,他是一个指针型常量,它的值在在程序运行期间是固定不变的。既然它是常量,a++自然无法实现。 (实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理。)

二维数组a的有关指针
表示形式含义地址
a二维数组名,指向一维数组a[0],即0行首地址2000
a[0],*(a+0),*a0行0列元素地址2000
a+1,&a[1]1行元素首地址2016
a[1],*(a+1)1行0列元素a[1][0]的地址2016
a[1]+2,*(a+1)+2,&a[1][2]1行2列元素a[1][2]的地址2024
*(a[1]+2),*(*(a+1)+2),a[1][2]1行2列元素a[1][2]的值元素值

int *p(函数参数)---------返回值为整形指针的函数

int (*p)(指向的函数的参数类型)---------函数指针

int *p[3]-------------指针数组

int (*p)[3]-------------指向含有三个整形元素的一维数组


char *string="I love China";等价于

char * string;

string="I love China";      //将字符串首元素地址赋给string

但不能用以下办法对字符数组名赋值:

char str[14];

str="I love China!";   //数组名是地址,常量,不能被赋值,非法。

但是对于字符数组初始化可以这么做

char [14]="I love China";

编译时,字符数组分配若干存储单元,而对字符指针变量,只分配一个存储单元。

而对于字符数组中各元素是可以改变的,但字符指针变量指向的是字符串常量,其内容是不可以改变的。引用的时候注意,如果指针变量如果没有指向数组,就无法引用,也就是常说的野指针。


如果p指向一个结构体变量stu,以下3用法等价:

1.stu.成员名 2.(*p).成员名3.p->成员名(推荐如果指针的话,一般用第三种,因为比较直观嘛)

有关结构体的对其原则:一般按4字节对齐,但是如果其中有比四字节大的变量,比如double那么最小对齐原则就按字节数最大的变量来。

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值