01 C语言中的一些细节

来源:互联网 发布:进口软件关税 编辑:程序博客网 时间:2024/05/16 10:17
1(网络编程模型){网络编程分为B / S模型与C / S模型,B指Browsers,C指ClientsB / S模型中,走的应用层协议是HTTP协议,走的是行业标准化的报文C / S模型中,C与S之间走的应用层协议是基于TCP / UDP的自定义的协议,走的是自定义的报文;}2(业务模块的功能抽象){客户端接口服务器;1:客户端初始化环境<-->??;2:客户端发报文<-->??;3:客户端收报文<-->??;4:客户端销毁环境<-->??;客户端调用接口,}3(头文件重复包含的解决){#ifndef _SOMEH__#define _SOMEH__内容#endif}4(VS快捷键){Shift + Del;// 快速删除一行Ctrl + U;// 让单词从小写变大写Shift + Ctrl + U;// 让单词从大写变小写F9;// 加断点}5(数组名做函数参数,参数会退化为指针){若有;int a[10];int num = sizeof(a);// num值为整个数组所占的空间若有一函数定义为fun(int a[267]), 如下调用;fun(a){int num = sizeof(a);// num值既不是nums[10]的空间,也不是nums[267]的空间,而是一个int*型指针变量的空间,因为在传参至函数中时,数组名会退化为指针类型}并且,无论形参中数组的容量写多少,都会退化为指针;fun(int nums[267]);// 实质传进函数的是int * 类型fun(int nums[]);// 同上fun(int nums[][20]);// 实质上传的是int [20]型的指针对于fun(int nums[][20]),比较特殊,但其实也不特殊,实质上传递的也是一个指针,指针的类型是int[20] *型的,即把int[20]当作一个类型的话,即就是这个类型的指针;换句话说,这样传二维数组时,高层数组的容量是不知道的,因为只传了一个指针,而低层数组则被当成了数据类型,函数本身认为低层数组容量是20;在函数的形参列表中一旦出现*或[],默念三遍“只传值,不传类型”}6(一级指针的第一座大山:指向数组名的指针){int a[40];printf("%d\n%d\n", a, &a);// 两值相同printf("%d\n%d\n", a + 1, &a + 1);// a+1步进4,&a+1步进40a代表数组名,&a代表该a[40]整个数组的地址,其值都等于a[40]数组在内存中的首地址;但a + 1是以数组内元素的空间步进的,而&a + 1则是以整个数组的容量步进的;即a本身的类型是int *, 而&a本身是int[40] * 类型;即int a[20]与int a[40]是两种不同的简单数据类型,所占容量不一样,请看7}7(数据类型的本质){数据类型可理解为创建变量的模具,本质是固定大小内存块的别名;为数据指定类型的作用在于,在编译器创建对象的时候,编译器知道该为该变量分配多大的内存;可以通过sizeof()函数求出数据类型的大小,以字节为单位返回unsigned int类型返回值}8(void *类型与数据类型封装){void * p;int a;double b;struct student c;p = &a;p = &b;p = &c;以上语句都合法int cltSocket_init(void ** handle);void *是API作者用来封装函数的参数类型的作法;void指针的用法,主要是用于将一个不知道数据类型(或者不需要关心其类型)的指针传进函数,只是用来传首地址的!!其次是将一个内存地址传出函数作为返回值,如下;void * getTeacher(){void * p = malloc(199);reutrn p;}}9(函数本身是一种数据类型吗?){要回答这个问题,要认识到函数是什么;从程序设计的角度来讲,函数是一个描述某种过程的代码集合,是对一个过程的描述;但是,从内存角度来讲,一个自定义函数声明了它自己的时候,程序在运行时就要存储该函数的代码,函数本身在静态区要占据一定的内存,所以从这个角度讲,函数本身也是一种数据类型;而函数名本身,就是指向这个函数本身在内存中存储区域的一个指针;如;double somefunction(double x);// 某个二维数学函数的求值函数double calculus(double low, double high, double(*fun)(double));这个微积分函数的第三个参数就是一个函数指针,即要传入一个函数的地址;函数指针当作形参书写时以以下格式书写:返回值类型(*函数名)(参数类型);如上例中,代表要传入calculus的第三个参数的,是一个【有double返回值,接受一个double类型参数】的函数的地址,调用时直接传入函数名即可,如:double sum = calculus(5.5, 7.7, somefunction);}10(变量与常量的实质){既能读又能写的一块内存区域,叫做内存对象,就称为变量;若一旦初始化之后,该内存区域的内容便不可更改,则称其为常量;变量的本质就是该内存块的起始地址与该内存块的容量的记录器,即一块内存空间的别名;代码中的变量,只是一个标号,如定义了int a = 10; 程序只存储10,但不会存储字母a,这个别名只对人有用,只是为了让人去指定一个固定的内存块,即变量只存在于代码中,代码一经编译,所谓的a就不见了,对于机器来说,这没有意义,a只对人有意义;}11(类型的别名与内存空间/变量的别名){类型的别名,用typedef来起;而变量的别名,在C语言中是没有的,在C++中有&操作符来取别名,即为C++中的引用;int a = 10;int * p = &a;*p不能算是变量a的别名,因为*是运算符,p是一个变量,*p是一个表达式}

0 0
原创粉丝点击