C++ 数据类型提高+内存四区
2020-12-07 02:50
标签:举例 destory 发送 eof des 传参 概念 编译器 内存四区 # 这一章节全部是C语言的内容 # 内存四区 ##### 数组和数组元素指针 printf("b:%d,b+1:%d,&b:%d,&b+1:%d",b,b+1,&b,&b+1); ##### 数据类型的别名 ##### C语言数据类型封装 思考: ##### 变量本质 ##### 内存四区模型 ``` ``` **变量3要素** ##### 内存四区的建立流程 各元素分析 **注意:赋值语句直接在CPU执行** #ifdef _cplusplus //第一套api函数 //第二套api函数 //技术点分析 #ifdef _cplusplus #endif 看到14集 C++ 数据类型提高+内存四区 标签:举例 destory 发送 eof des 传参 概念 编译器 内存四区 原文地址:https://www.cnblogs.com/littlepage/p/10989595.html
# 数据类型提高
**注意**
1.数组作为形参会退化为指针(验证,传参后用sizeof进行打印,可以看出打印出数组的字节为一字节)
2.形参在函数上和函数内是一样的,只不过对外开放
```
void main(){
int a;//告诉编译器分配4个字节内存
int b[10];//告诉编译器自己分配40个内存
printf("hello...\n");
system("pause");
}
```
**注意**
- b+1和&b+1结果不一样,因为代表的数据类型不一样
- b代表的是整个数组首元素地址
- &b代表的是整个数组的地址
(验证方法,打印地址或者sizeof验证)
```
typedef struct Teacher{
char name[64];
int age;
}Teacher;
void main(){
Teacher t1;
}
```
```
struct Teacher{
char name[64];
int age;
}Teacher;
void main(){
struct Teacher t1;
}
```
可以看出typedef的实际功能是将**结构体**定义成一个可以用的变量,对**基本类型**也有效
1.void字面意思是无类型,void则是无类型指针,可以指向任何数据
2.用法一:数据类型分封装
```
int initHardEnv(void **handle)
```
3.用法二:void返回值表示无
4.void指针的意义
只有相同类型的指针才可以互相赋值
```
举例:
char *p2=NULL;
p2=(char*)malloc(100);
如果不进行强制类型转换,那么默认是void指针
void *p1=malloc(100);
这个是可行的
```
C语言中,函数是一种数据类型么?以及函数可以重定义么?
答案是可以的,之后在函数和回调函数中可以提到
变量的本质是一段连续内存空间的别名
修改变量几种方法
1.直接修改内存
2.间接修改内存
void main(){
int a;
a=10;//直接赋值
printf("%d\n",a);
//17823600打印查看到a的值
*((int*)17823600)=200;//间接赋值,通过内存
printf("%d\n",a);
{
p=17823600;
*p=200;//指针间接赋值
}
system("pause");
}
3.对内存空间能不能再起别名?可以
名称,大小,作用域
生命周期(比如在代码块中生命周期仅仅在代码块中)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019052420393831.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xpdHRsZVBhZ2U=,size_16,color_FFFFFF,t_70)
流程:
1.操作系统把物理硬盘load到内存
2.操作系统把C代码分为4个区
3.操作系统找到main函数入口执行
栈区(stack),由编译器自动分配释放,存放函数的参数值,局部变量值等
堆区(heap),由程序员释放,程序员不释放,则程序结束后被系统回收
全局区(static),全局变量和静态存储放在一块,放变量
常量区,存放常量
代码区,存放函数体和二进制代码
# 抽象接口Socket的C语言API
```
//Socket.h
#ifndef _SOCKET_H
extern "C"{
#endif
//socket客户端初始化
int socketclient_init(void **handle);
//socket客户端发送
int socketclient_send(void *handle,unsigned char *buf,int buflen);
//socket客户端报文接受
int socketclient_recv(void *handle,unsigned char *buf,int *buflen);
//socket客户端环境释放
int socketclient_destory(void **handle);
//socket客户端初始化
int socketclient_init2(void **handle);
//socket客户端发送
int socketclient_send2(void *handle,unsigned char *buf,int buflen);
//socket客户端报文接受
int socketclient_recv2(void *handle,unsigned char **buf,int *buflen);
int socketclient_free(unsigned char **buf);
//socket客户端环境释放
int socketclient_destory2(void **handle);
//1级指针
//2级指针
//void **handle类型封装的概念 业务模型封装的概念
}
#endif
```
我们要学会断层抽象出业务模型