zoukankan      html  css  js  c++  java
  • 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... ");
    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 ",a);
    //17823600打印查看到a的值
    *((int*)17823600)=200;//间接赋值,通过内存
    printf("%d ",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集

  • 相关阅读:
    Reporting Services 配置工具
    管道符、重定向和环境变量
    靶机DC-2 rbash绕过+git提权
    单表查询
    数据库和表的基本操作(二)
    数据库和表的基本操作(一)
    MySQL的约束
    bugku-misc 9-16
    Linux基础命令
    时间-i春秋
  • 原文地址:https://www.cnblogs.com/littlepage/p/10989595.html
Copyright © 2011-2022 走看看