# 这一章节全部是C语言的内容
# 数据类型提高
**注意**
1.数组作为形参会退化为指针(验证,传参后用sizeof进行打印,可以看出打印出数组的字节为一字节)
2.形参在函数上和函数内是一样的,只不过对外开放

# 内存四区

##### 数组和数组元素指针
```
void main(){
int a;//告诉编译器分配4个字节内存
int b[10];//告诉编译器自己分配40个内存

printf("b:%d,b+1:%d,&b:%d,&b+1:%d",b,b+1,&b,&b+1);
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的实际功能是将**结构体**定义成一个可以用的变量,对**基本类型**也有效

##### C语言数据类型封装
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.对内存空间能不能再起别名?可以

**变量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),全局变量和静态存储放在一块,放变量
常量区,存放常量
代码区,存放函数体和二进制代码

**注意:赋值语句直接在CPU执行**
# 抽象接口Socket的C语言API
```
//Socket.h
#ifndef _SOCKET_H

#ifdef _cplusplus
extern "C"{
#endif

//第一套api函数
//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);

//第二套api函数
//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类型封装的概念 业务模型封装的概念

#ifdef _cplusplus
}
#endif

#endif
```
我们要学会断层抽象出业务模型

看到14集

C++ 数据类型提高+内存四区的更多相关文章

  1. C语言提高 (1) 第一天 数据类型本质与内存四区

    (物联网的分层的概念 b/s c/s 结构 习惯: 在C语言 0 函数执行成功 <0是错误 >1做一些返回值处理 3 课前准备 工作经验,记录 4 数据类型的本质 数据类型的本质是固定大小 ...

  2. C++变量存储类别和内存四区

    变量存储类别 变量声明/定义的一般形式: 存储类别 数据类型 变量名 存储类别指的是数据在内存中存储的方法.存储方法分为静态存储和动态存储两大类.标准C语言为变量.常量和函数定义了4种存储类型:ext ...

  3. C/C++内存四区

    内存模型图 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中0~3G是用户态空间,3~4G是内核空间,不同进程相同的逻辑地址会映射到不同的物理地址中.其逻辑地址其划分如下: 各 ...

  4. C++ 内存四区 理解总结

    内存模型图(4G) 整体简单说明 32位CPU可寻址4G线性空间,每个进程都有各自独立的4G逻辑地址,其中 03G是用户空间**,**34G是内核空间即3G用户空间和1G内核空间,不同进程相同的逻辑地 ...

  5. 面向过程—面向对象(C++的封装,this)_内存四区_变量生命周期

    1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联 ...

  6. 深入理解C语言-深入理解内存四区

    数组与指针 当数组做函数参数的时候,会退化为一个指针 此时在函数内是得不到数组大小的 因此,数组做函数参数的时候需要传递数组大小,也就是多传递一个参数 void func(int arr[], int ...

  7. C语言内存四区的学习总结(三)---- 栈区

    接上篇内存四区的堆区的总结,下面做一些栈区的相关总结. 一.栈区的分析: 就下面测试程序 #include "stdio.h" #include "string.h&qu ...

  8. C语言内存四区的学习总结(二)---- 堆区

    接上篇,内存四区的分析-静态区,下面来说明一下堆区总结. 堆区分析: 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回 就下面的程序: #inc ...

  9. C语言内存四区的学习总结(一)---- 静态区

    最近重新学习C语言相关知识,重新提到内存四区的概念,那么在之前的学习的基础上,在这儿做一个简单的总结与分享. 一.内存四区建立的流程 可以简单直观的查看下面的这个图片,直接的说明我们的程序在内存中是如 ...

随机推荐

  1. UVA 572 -- Oil Deposits(DFS求连通块+种子填充算法)

    UVA 572 -- Oil Deposits(DFS求连通块) 图也有DFS和BFS遍历,由于DFS更好写,所以一般用DFS寻找连通块. 下述代码用一个二重循环来找到当前格子的相邻8个格子,也可用常 ...

  2. Uva 101 -- the block problem

    Uva 101 the block problem 题目大意: 输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置.现对这些木块进行操作,操作分为四种. 1.move a o ...

  3. golang入门案例之http client请求

    发请求,接收接送,并解析 package main import ( "fmt" "net/http" "io/ioutil" " ...

  4. linux中zookeeper开机自启动和注册为服务

    1.安装jdk,zookeeper就不说啦,自己搜索下. 2.开机自启动和注册为服务. (1)开机自启动:编辑/etc/rc.d/rc.local文件,添加zkServer.sh路径. vi /etc ...

  5. 浅谈 MySQL的预编译

    之前的一篇 Mybatis中 #{}和${}的区别 中涉及到通过 SQL预编译和 #{} 传值 的方式防止SQL注入. 由此引发了想了解预编译的想法.那么什么是预编译那? 一.三个阶段: 词法和语义解 ...

  6. 1.2.2 OSI参考模型 下

    [今天打酱油了,纯抄书.OSI太重要,不敢随便乱写.] 一.开放系统互联参考模型 答:20世纪80年代初,ISO提出来著名的开放系统互联参考模型[Open Systems Interconnectio ...

  7. 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...

  8. 微信小程序开发(三)----- 云开发案例

    1.发送请求 2.云函数中发送请求,例子request https://github.com/request/request-promise    创建云函数movielist,右键在终端打开,输入  ...

  9. vs2015中将复制过来的文件夹显示目录文件

    先将文件夹和文件复制到VS程序所在的位置,点击解决方案资源管理器上的“显示所有文件”按纽,展开这个文件夹,这样你就可以看到这个文件或者文件夹了,这时,这个文件或者文件夹是虚线构成的.你右击这个文件或者 ...

  10. MySQL -2- 体系结构--随笔小记

    简介与安装NoSQLRDBMS版本安装方式二进制安装,源码安装体系结构CS模型TCP/IPsocketmysql master thread 实例mysqld 的程序构成连接层 协议.验证.链接线程S ...