zoukankan      html  css  js  c++  java
  • 数据结构之预备知识

    指针

    指针的重要性

    指针是C语言的灵魂
    

    定义

    ####地址
    
        -内存单元的编号
    
        -从零开始的非负整数
    
        -范围:0-FFFFFFFF(0 - 4G-1)
    
    ####指针
    
        -指针就是地址,地址就是指针
    
    
        -指针变量是存放内存单元地址的变量
    
        -指针的本质是一个操作受限的非负整数
    
    ####分类
    
        1.基本类型指针
    
            基本概念:
                int i = 10;
                int *p = &i;//等价于 int *p; p = &i;
                详解操作:
                    1)p存放了i的地址,所以我们说p指向i
                    2)p和i是两个完全不同的变量,修改其中任意一个变量的值,不影响另一个
                    3)p指向i,*p就是i变量本身,更形象的说所有出现*p的地方都可以换成i反之亦然
                总结:1.如果一个指针变量(假定为p)存放了某个普通变量(i)的地址,那我们就可以说:“p指向了i”,但是p和i是两个完全不同的变量。
                      修改一个值不会影响另一个的值
                      2.*p等价于i。或者说*p和i可以在任何地方互换
                      3.如果一个指针变量指向了一个普通变量,则*指针变量  就完全等价于 该普通变量
    

    、 注意:指针变量也是变量,只不过他存的不能是内存单元的内容,而是内存单元的地址,
    普通变量前不能加*
    常量和表达式不能加&
    ?:如何通过被调函数修改主调函数中普通变量的值
    - 实参为相关变量的地址
    - 形参为以该变量的类型为指针的指针变量
    - 在被调函数中通过*形参变量名 的方式就可以修改主函数中的普通变量
    2.指针和数组
    指针和一维数组
    数组名是一个指针常量
    他存放的是一维数组第一个元素的地址
    他的值不能被改变
    一维数组名指向的是数组的第一个元素
    下标和指针的关系:

                 a[i]   <<==>>  *(a+i)
                
                假设指针变量的名字为p
                则p+i的值是p+i*(p所指向的变量所占用的字节数)
            指针变量的运算:
                指针变量不能相加乘除。
                如果两指针变量属于同一数组,则可以相减
                指针变量可以加减一个整数,前提是最终结果不能超过指针允许指向的范围
                    p+i  的值是 p+i*(p所指向的变量所占的字节数)
                    p-i  的值是 p-i*(p所指向的变量所占的字节数)
                    p++   <<==>>  p+1
                    p--   <<==>>  p-1
    
            举例:如何通过被调函数修改主调函数中一维数组的内容(如何界定一维数组)
                两个参数
                    存放数组首元素地址的指针变量
                    存放数组元素长度的整形变量
    
            不管是什么类型的变量,如果需要使用被调用函数改变主调用函数的变量,只需要将实参写为他的地址,然后在被调用函数中进行变化
    

    结构体

    为什么会出现结构体

    为了表示一些复杂的数据,而普通的基本类型变量无法满足要求
    

    什么叫结构体

    结构体是用户根据自己的实际需要自己定义的复合数据类型
    

    如何使用结构体

    两种方式:
        struts Student st = {...};
        struts Student *pst = &st;
            1.st.id=...
            2.pst->id = ...
                pst所指向的结构体变量中的id这个成员
    

    注意事项

    1.结构体变量不能加减乘除,但能够相互赋值
    2.普通结构体和结构体指针变量作为函数传参的问题

    动态内存分配和释放

    ###动态构造一k数组
        假设动态构造一个int型数组
        int *p = (int*)malloc(sizeof(int)*len);//这一句主要就是给int型数组分配空间
            1.malloc只有一个int性的参数,表示要求系统分配的字节数
            2.malloc函数的功能是请求系统len个字节的内存空间,如果请求分配成功则返回第一个字节的地址,如果分配不成功,则返回NULL
            3.malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无实际意义的第一个字节的地址(俗称干地址)转换为一个有实际意义的
                地址,因此,malloc前面必须加上(数据类型 *),表示把这个无实际意义的第一个字节的地址转化为相应的地址。如:
                int *p = (int *) malloc(50);
                    表示将系统分配好的50个字节的第一个字节的地址转化为int * 型的地址,更准确的说是把第一个字节的地址转化为四个字节的地址,这样
                p就指向了第一个的四个字节,p+1就指向了第二个的四个字节,p+i就指向了第i+1个四个字节,p[0]就是第一个元素,p[i]就是第i+1个元素。
                double *p =(double *)malloc(80);
                    表示将系统分配好的80个字节的第一个字节的地址转化为double 8 型的地址,更准确的说是把第一个字节的地址转化为8个字节的地址,这样p就指向了
                第一个8个字节,p+1就指向了第二个的8个字节p+i就指向了第i+1个的8个字节,p[0]就是第一个元素,p[i]就是第i+1个元素。
        free(p) 释放p所指向的内存,而不是释放p本身所占用的内存。
  • 相关阅读:
    verilog parameter 位宽问题
    quartus prime 16.0 报警告 inferring latch
    Quartus prime16.0 组合逻辑always块中敏感向量表不全
    centos6.8下安装matlab2009(图片转帖)
    centos6.8下普通用户下quartus编程识别不到用户开发板
    centos6.8下安装破解quartus prime16.0以及modelsim ae安装
    PHP TP 生成二维码
    模态框MODAL的一些事件捕捉
    iOS微信第三方登录实现
    PHP ini 配置无效的坑给自己记录
  • 原文地址:https://www.cnblogs.com/strator/p/7224081.html
Copyright © 2011-2022 走看看