C++ 数据类型提高+内存四区

# 这一章节全部是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集

原文地址:https://www.cnblogs.com/littlepage/p/10989595.html

时间: 2024-11-10 08:39:55

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

C 提高1 内存四区 变量本质 栈开口方向 指针铁律1

C 提高第一天复习 内存四区,变量常量的本质,函数调用模型,栈开口方向,指针铁律1,指针是一种数据类型 C 提高学员标准:写一个标准的冒泡排序 选择法或者冒泡法排序 在一个函数内排序 通过函数调用的方式排序 数组做函数参数的技术盲点和推演 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i = 0; int j = 0; int tmp = 0; int a[] = 

深入理解数据类型、变量类型属性、内存四区和指针

数据类型可理解为创建变量的模具(模子):是固定内存大小的别名. 数据类型的作用:编译器预算对象(变量)分配的内存空间大小. 既能读又能写的内存对象,称为变量:若一旦初始化后不能修改的对象则称为常量. 变量本质:(一段连续)内存空间的别名. 内存四区 栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等. 堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收. 全局区(静态区)(static):全局变量和静态变

C语言提高之技术模型层次、学习标准、特点、内存四区、函数调用模型

1.C语言技术模型分层: 其中,接口的封装和设计尤为重要! 2.着重需要培养的能力 (1)接口的封装和设计(业务模型的抽象.功能抽象和封装) ---重中之重! a.接口api的使用能力: b.接口api的查找能力(快速上手): c.接口api的实现能力: // SOCKETCLIENT_H,一个简单信息系统的封装接口 #ifndef _SOCKETCLIENT_H #endif _SOCKETCLIENT_H #ifdef __cplusplus extern "C" { #endif

C语言 内存四区与函数调用模型

C语言提高笔记 标签(空格分隔): C++ C语言 day1 数组做函数参数的退回问题 数组做函数参数会退回为一个指针, 正确做法:把数组的内存首地址和数组的有效长度传给被调用函数. 实参的a 和 形参的a 的数据类型本质不一样, 形参中的数组,编译器会把它当成指针处理 只会分配四个字节. 形参写在函数上,和写在函数内是一样的,只不过是具有对外的属性而已. 数据类型本质分析 数据类型可理解为创建变量的模具(模子):是固定内存大小的别名: 数据类型的作用:编译器预算对象(变量)分配的内存空间大小

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

1.面向对象主要涉及  构造函数.析构函数.虚函数.继承.多态等. 2.对各种支持 的底层实现机制 c语言中,数据 和 处理数据的操作(函数) 是分开来声明,即语言本身并没有支持 “数据和函数”的关联性. 在C++中,通过抽象数据类型(abstract data type, ADT),在类中定义数据和函数,来实现数据和函数直接的绑定. C++成员数据:static.nonstatic C++成员函数:static.nonstatic.virtual C++中的类class从面向对象理论出发,将变

内存四区模型与指针

数据类型的封装 1.void的字面意思是"无类型",void 则为"无类型指针",void 可以指向任何类型的数据. 2.用法1:数据类型的封装 int InitHardEnv(void **handle); 典型的如内存操作函数memcpy和memset的函数原型分别为 void * memcpy(void *dest, const void *src, size_t len); void * memset ( void * buffer, int c, size

c语言内存四区模型

c语言内存四区模型:代码区,全局区(常量区),栈区,堆区 在全局区(常量区),两个字符串完全一样c++编译器只会定义一份 char * getBuf() { char buf[20]; strcpy(buf, "abcde"); return buf; } abcdX?  有乱码! 确实把内存地址返回了,但不能用 被调函数调用完毕,在临时区分配的内存统统消失 char *buf= (char *)malloc(sizeof(char)*20); 手动malloc申请一份内存,由程序员手

内存四区中全局区见解

今天我把自己对于内存四区中全局区见解写出来,希望可以帮到大家,同时也希望指出我的不正! 可能有些人不解,我不是想通过,内存四区引入指针么?怎么上来就用指针? 这一点我要说明一下,我用指针是为了更清楚的表明我对于内存四区的见解,是想让大家明白,内存四区是什么?栈区,堆区和全局区之间的关系! 正如同在栈区和在堆区分配的内存空间是不同的!指针里存的是地址,地址是哪里的地址?是内存上的地址!而如果我们分不清我们的指针到底指向的是哪一个区域的地址,调用起来岂不是很麻烦.比如我们在子函数上分配了一个变量(栈

内存四区

突然想起来之前有同学问我C语言里关于指针的问题,虽然解释的半天,但是仍感觉对方似懂非懂,于是想起去年我老师教我时,是让我先搞清内存四区,再对我讲解有关指针方面的问题,于是就想着把自己的见解在这里写下来. 内存四区 1.栈区(俗称内存又称cpu) 将地址调入之后,cpu开始运行这个地址的程序,类似于鼠标双击图标,就是将地址写入cpu 2.全局区 例如在主函数中定义的变量可在子函数中调用(可称为全局变量),但子函数中定义的变量不可以在主函数中调用,除非是子函数将内存地址指向全局区可在主函数中调用,静