《C专家编程》总结_c语言编程自我总结

其他工作总结 时间:2020-02-27 10:39:43 收藏本文下载本文
【www.daodoc.com - 其他工作总结】

《C专家编程》总结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言编程自我总结”。

《C专家编程》总结

开始读《C专家编程》之前,有一个很担心的问题:94年出的讲语言的书,在现在(2012)还有多少是适用的。因此,一边读,一边用VS2010做实验。最后发现大部分内容都还在用。读完后,觉得最精彩的部分有二:一是讲解如何理解声明,二是深入地讲解数组名与指针。下文是将看书过程中所做的笔记进行的整理。

p.s: 以下代码均在VS2010测试过

1.使用无符号数时要特别注意(不推荐使用无符号数)当无符号数与有符号数在同一条表达式中出现时,有符号数会被转换为无符号数。e.g:

int feng =-1;unsigned int yan = 5;bool result =(feng

char *str[] = {“feng” “yan”, “zero”};//“feng”和“yan”被合并成一个了:“fengyan” 3.易出错的优先级

.高于* e.g: *p.f 正确的理解:*(p.f)

[]高于* e.g: int *ap[] 正确的理解:int *(ap[])ap是个数组,其元素为int* 函数()高于* e.g: int *fp()正确的理解:int* fp()fp是返回int*的函数

==和!=高于位操作符 e.g: val & mask!= 0 正确的理解:val &(mask!= 0)==和!=高于赋值符 e.g: c = getchar()!= EOF 正确的理解:c =(getchar()!= EOF)

算术运算高于移位运算 e.g: msb

a.找标识符

b.找被括号括起来的部分

c.找后缀操作符,如果是(),则表示是函数;如果是[],则表示是数组 d.找前缀操作符,如果是*,则表示“指向XX的指针”

e.找const和volatile,如果const,volatile后面紧跟类型(如int,long),那么它作用于类型,其它情况下,作用于它左边紧邻的项 e.g:

int const * zero;//zero是一个指针,指向一个常量整形

char(*zero)[20];//zero是一个指针,指向一个有20个char元素的数组

typedef void(*ptr_to_func)(int);//ptr_to_func是新类型名,这种类型是一个函数指针,指向接收一个int参数,并返回void的函数

char* const *(*zero)();//zero是一个函数指针,该函数无参数,并返回一个指针,返回的指针指向一个常量指针

char*(*zero[10])(int **p);//zero是一个数组,元素是函数指针,其指向的函数授受一个二维指针,并返回一个指向char的指针 void(*signal(int sig, void(*func)(int)))(int);//signal是一个函数,该函数接收一个int,一个函数指针,并返回一个函数指针

5.左值与右值

左值通常表示存储结果的地方(地址),其值在编译时可知 右值通常表示地址的内容,其值通常要到运行时才知道

6.指针与数组名不等同的情况(定义为数组,却声明为指针,或者反过来)前提知识(假设有定义:int array[10], *ptr;):

a.使用数组名下标访问(如:array[1]),会直接将数组名的地址加上偏移值作为变量的地址(即array[1]的地址)

b.使用指针下标访问(如:ptr[1]),会先取指针指向的内容,然后将这个内容加上偏移值作为变量的地址(即ptr[1]的地址)

不等同的原因:

当定义为数组,却声明为指针时,相当于用指针下标访问的方法来解析一个数组名下标,即先取数组第0号元素的内容,然后将这个内容加上偏移值作为变量的地址,从而访问了不该访问的东西。反之亦然。7.指针与数组等同的情况

a.编译器将表达式中的数组名当作指向该数组第0号元素的指针,下标当作指针的偏移量,即array[i]会被当作*(array + i)

b.编译器将函数参数声明中的数组名当作指向该数组第0号元素的指针,即在函数内部得到的是指针,而不是数组名

基于a情况,可知这条谣言是假的(至少在一维数组中一定不成立): 用指针迭代数组比用下标迭代数组更快

基于b情况,可解释为什么在传递数组后,不能用以下方法计算数组长度

int ArrayLength(int arr[]){ return sizeof(arr)/ sizeof(arr[0]);//返回值必定是1,因为此时的arr是一个指针,而不是数组名 } 注意b情况的将数组改写为指针并不是递归定义的,e.g:

实参 char zero[10][10] 被改写为 char(*zero)[10],这里将数组的数组改写为数组的指针

实参 char *zero[10] 被改写为 char **zero,这里将指针数组改写为指针的指针

实参 cahr(*zero)[10] 不改变,因为此时的zero是指针,而不是数组 8.interposition interposition指用户定义的函数取代库中声明完全相同的函数,注意这不是指重载,而是指下面这种:

void zero();//user defined function void zero();//library function 出现interposition时,要特别注意以下情况:

void zero();//user defined function int main(){ zero();//调用用户定义的函数zero,而不是库函数zero

FengYan();//假设这是另一个库函数,并且函数内调用库函数zero,此时由于interposition,变成调用用户定义的zero return 0;} 备注:

出现interposition时,在VS2010会出现warning: inconsistent dll linkage 9.堆栈段作用

a.存储局部变量

b.函数调用时,存储有关的维护信息

c.用作暂时存储区。e.g: 计算一个很长的表达式时,会把部分结果先压到堆栈中

编程知识总结C难点总结

《编程知识总结》—C#难点总结 1.编写菜单中对应子菜单项的消息响应函数,考虑的方面很多,例 如,当前打开一个文件,此文件已经被修改,如果用户需要新建 或者打开另外一个文件,程序......

C语言编程自我总结

1.编译器选择8级优化时,可能会出现错误。刚写好的程序,建议先用0级优化看能否正常运行,再用更高的优化等级进行优化。2.a、写中断程序一定要用using语句指定寄存器组。第1、2、......

C语言编程

#include(stdio.h)main(){ int question[4]={-1,-1,-1,-1},i=0,j=0,k=0,A=0,B=0,answer[4]={0};char again='y';while(again=='y') { srand((int)time(0));while(i4) {......

c语言编程练习

本实验所有题目均要求使用指针。1.写一函数,将一个3*3的整型矩阵转置。2.将两个按升序排列的数组合并成一个数组,并使合并后的数组也按升序排列。 要求: (1)输入两个数组(按升序);(2)......

手机短号C编程

课程设计(论文)题 目 名 称 手机短号 课 程 名 称 C语言程序课程设计 学 生 姓 名 肖桂超 学 号 1041301049 系、专 业 信息工程系、电子信息工程 指 导 教 师 谢兵2011年......

下载《C专家编程》总结word格式文档
下载《C专家编程》总结.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文