c基础提高01

使用函数模块化编程;
函数的特点:
1、减少代码的冗余
2、程序结构清晰
3、利于阅读
数据类型概念: 数据类型是为了更好进行内存的管理,让编译器能确定分配多少内存。
  • 类型是对数据的抽象;
  • 类型相同的数据具有相同的表示形式、存储格式以及相关操作;
  • 程序中所有的数据都必定属于某种数据类型;
  • 数据类型可以理解为创建变量的模具:固定大小内存的别名;
为什么区分数据类型:
不同数据类型分配不同存储空间,节省内存空间;
不同数据类型储存数据不同;
不同类型在进行转化可以方便操作;
基本数据类型:char,short,int,long,long long ,float,double,void(不能直接定义void类型变量)
复合数据类型:数组,结构体struct,联合体union,枚举enum
指针数据类型:在数据类型之后加上*,void*
void 的两个应用方面
1、对函数返回的限定
2、对函数参数的限定
数据类型大小:
sizeof(数据类型)、sizeof(变量)、sizeof 变量
数据类型总结
  • 数据类型本质是固定内存大小的别名,是个模具,C语言规定:通过数据类型定义变量;
  • 数据类型大小计算(sizeof);
  • 可以给已存在的数据类型起别名typedef;
  • 数据类型的封装(void 万能类型);
标识符的命名规则:
1、字母,数字,下划线组成
2、数字不能作为开头
3、不能是c语言关键字
4,、见名知意
变量名本质:
  • 变量名的本质:一段连续内存空间的别名;
  • 程序通过变量来申请和命名内存空间 int a = 0;
  • 通过变量名访问内存空间;
  • 不是向变量名读写数据,而是向变量所代表的内存空间中读写数据;
变量:既能读又能写的内存对象
常量:只能读的内存对象 //const 数据类型 变量名 、#define 常量名 常量
全局变量:作用域为整个项目,其它文件使用需使用extern声明,生命周期为整个程序运行期间
局部变量:作用域为代码块,生命周期为声明开始到代码块结束
静态全局变量:作用域为本文件,生命周期为整个程序运行期间
静态局部变量:作用域为代码块,生命周期为整个程序运行期间
函数(默认为全局函数):作用域为整个项目,生命周期为整个程序运行期间
静态函数:作用域为本文件,生命周期为整个程序运行期间
c程序编译过程
预处理:宏定义展开、头文件展开、条件编译,这里并不会检查语法 gcc -E a.c -o a.i 
编译:检查语法,将预处理后文件编译生成汇编文件 gcc -S a.i -o a.s
汇编:将汇编文件生成目标文件(二进制文件) gcc -c a.s -o a.o
链接:将目标文件链接为可执行程序 gcc  a.o -o a.exe
内存4区模型
代码区:
计算机程序指令

只读,共享

规划了局部变量的相关信息
数据区:
1.常量区
字符串常量char* s = "hello";
文字常量
2.初始化数据区:
全局变量,全局常量,
static修饰的全局,局部变量
3.未初始化数据区:(bss段) 默认初始化为0或者NULL
全局变量,全局常量,
static修饰的全局,局部变量
栈区:
在程序加载到内存中,系统自动分配给每个程序一定的空间(一般情况windos下一般为1-8M,linux下一般为1-16M)用来存储数据,当程序执行完成,系统自动回收
存放:局部变量,const修饰的常量,指针,结构体,联合体,枚举,函数的形参
堆区:
由程序员自己分配和释放的空间。
堆空间开辟
malloc / calloc /realloc
释放
free
数据区

总体来讲说,程序源代码被编译之后主要分成两种段:程序指令和程序数据。代码段属于程序指令,而数据域段和.bss段属于程序数据。
表达式:
将变量或常量通过运算符连接起来
栈区生长方向:向下生长(高->低)
栈区储存模型:

堆区生长方向:向上生长(低->高)
开辟堆空间:malloc,calloc(会自动初始化值为0),realloc(重新分配malloc,calloc申请的堆空间大小,相当于扩容)
#include <stdlib.h>
void * calloc ( size_t nmemb , size_t size );
功能:
在内存动态存储区中分配nmemb块长度为size字节的连续区域。calloc自动将分配的内存    置0。
参数:
nmemb:所需内存单元数量
size:每个内存单元的大小(单位:字节)
返回值:
    成功:分配空间的起始地址
失败:NULL
#include <stdlib.h>
void * realloc ( void * ptr , size_t size );
功能:
重新分配用malloc或者calloc函数在堆中分配内存空间的大小。
realloc不会自动清理增加的内存,需要手动清理,如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内存,如果指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存。
参数:
ptr:为之前用malloc或者calloc分配的内存地址,如果此参数等于NULL,那么和realloc与malloc功能一致
size:为重新分配内存的大小 , 单位:字节
返回值:
成功:新分配的堆内存地址
失败:NULL
内存分区总结:
数据区包括:堆,栈,全局/静态存储区。
全局/静态存储区包括:常量区,全局区、静态区。
常量区包括:字符串常量区、常变量区。
代码区:存放程序编译后的二进制代码,不可寻址区。
函数调用模型:
在c语言里,存在着多个调用惯例,而默认的是cdecl.任何一个没有显示指定调用惯例的函数都是默认是cdecl惯例。
调用惯例
出栈方
参数传递
名字修饰
cdecl
函数调用方
从右至左参数入栈
下划线+函数名
stdcall
函数本身
从右至左参数入栈
下划线+函数名+@+参数字节数
fastcall
函数本身
前两个参数由寄存器传递,其余参数通过堆栈传递。
@+函数名+@+参数的字节数
pascal
函数本身
从左至右参数入栈
较为复杂,参见相关文档
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值