精华内容
下载资源
问答
  • 2.4、PHP数组与数组结构

    千次阅读 2018-03-13 14:40:02
    根据数组的下标( integer 和 string )不同,分为索引数组和关联数组。...数组结构: 键(key)可以是整数 integer 或字符串 string 值(value)可以是任意类型的值 array( key => va...

    根据数组的下标( integer 和 string )不同,分为索引数组和关联数组。但是官方说法是PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。

    一、定义数组
    数组结构:
    键(key)可以是整数 integer 或字符串 string
    值(value)可以是任意类型的值

    array(  key =>  value
         , ...
         )
    

    eg:

    <?php
    $array = array(
        "foo" => "bar",
        "bar" => "foo",
    );
    
    // 自 PHP 5.4 起
    $array = [
        "foo" => "bar",
        "bar" => "foo",
    ];
    

    注意事项:
    key 会有如下的强制转换:
    1、包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
    2、浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
    3、布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
    4、Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
    5、数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
    6、如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
    7、key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。

    eg:

    <?php
    $array = array(
             "a",
     "08" => "b",
      072 => "c",
             "d",
      9.7 => "e",
      true =>"f",
      NULL =>"g",
    		 "f",
    );
    var_dump($array);
    /*输出array (size=8)
      0 => string 'a' (length=1)
      '08' => string 'b' (length=1)
      58 => string 'c' (length=1)
      59 => string 'd' (length=1)
      9 => string 'e' (length=1)
      1 => string 'f' (length=1)
      '' => string 'g' (length=1)
      60 => string 'f' (length=1)*/
    	
    /**
     * 在给数组赋值时,给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值加上 1(但是最小为 0)。
     * 如果当前还没有整数索引,则键名将为 0。注意这里所使用的最大整数键名不一定当前就在数组中。
     * 它只要在上次数组重新生成索引后曾经存在过就行了。有点类似于数据库中的主键
     */
    // 创建一个简单的数组
    $array = array(1, 2, 3, 4, 5);
    print_r($array);
    
    // 现在删除其中的所有元素,但保持数组本身不变:
    foreach ($array as $i => $value) {
        unset($array[$i]);
    }
    print_r($array);
    
    // 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
    $array[] = 6;
    print_r($array);
    
    // 重新索引:
    $array = array_values($array);
    $array[] = 7;
    print_r($array);
    /*输出
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
    )
    Array
    (
    )
    Array
    (
        [5] => 6
    )
    Array
    (
        [0] => 6
        [1] => 7
    )*/
    
    

    二、数组遍历
    1、由于for局限性,遍历数组很少使用for,一般使用foreach,这里主要介绍下foreach遍历。
    语法:

    foreach ($array as $value){
    	...
    }
        
    foreach ($array as $key => $value){
    	...
    }
    

    可以通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。
    eg:

    <?php
    $arr = array(1, 2, 3, 4);
    foreach ($arr as &$value) {
        $value = $value * 2;
    }
    // $arr is now array(2, 4, 6, 8)
    unset($value); // 最后取消掉引用
    

    $value 的引用仅在被遍历的数组可以被引用时才可用(例如是个变量)。以下代码则无法运行:
    eg:

    <?php
    foreach (array(1, 2, 3, 4) as &$value) {
        $value = $value * 2;
    }
    

    2、list,each,while联合使用遍历数组
    先声明的是,这种方法很少使用。且由于本身限制很多,搞的我都不想写这一块。
    1)list
    像 array() 一样,这不是真正的函数,而是语言结构。 list() 可以在单次操作内就为一组变量赋值。
    注意:
    ①list() 仅能用于数字索引的数组,并假定数字索引从 0 开始,而且必须是索引数组(键名从0开始,且连续),数组中可以含非数字的键名,描述的可能有点矛盾,下边示例中,一目了然。
    ②PHP 5 里,list() 从最右边的参数开始赋值; PHP 7 里,list() 从最左边的参数开始赋值。官方说后期还可能会变化。
    ③在 list() 执行过程中修改数组(比如使用 list($a, $b) = $b)将会产生不可预知的结果。

    <?php
    $info = array('a', 'b', 'c');
    
    // 列出所有变量
    list($a, $b, $c) = $info;
    var_dump($a,$b,$c);//输出'a','b','c'
    
    // 列出他们的其中一个
    list($a, , $b) = $info;
    var_dump($a,$b);
    
    // 或者让我们跳到仅第三个
    list( , , $a) = $info;
    var_dump($a);
    
    // list() 不能对字符串起作用
    list($bar) = "abcde";
    var_dump($bar); // NULL
    
    //php5,php7区别
    list($d[], $d[], $d[]) = [1, 2, 3];
    var_dump($d);//php5输出array(3,2,1),php7输出array(1,2,3)
    
    //输出顺序,这也是对list,each,while联合使用的关键
    list($e,$f,$g) = array(0=>'b',2=>'a',1=>'c','a'=>'d');
    var_dump($e,$f,$g);//注意输出顺序,输出bca
    
    //使用嵌套的 list()
    list($a1, list($b1, $c1)) = array(1, array(2, 3));
    var_dump($a1, $b1, $c1);
    

    2、each
    返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为0,1,key和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
    如果内部指针越过了数组的末端,则 each() 返回 FALSE。

    eg:

    <?php
    $foo = array("a", "b", "c");
    $bar = each($foo);
    $bar1 = each($foo);
    var_dump($bar,$bar1);
    
    /*输出
    array (size=4)
      1 => string 'a' (length=1)
      'value' => string 'a' (length=1)
      0 => int 0
      'key' => int 0
    array (size=4)
      1 => string 'b' (length=1)
      'value' => string 'b' (length=1)
      0 => int 1
      'key' => int 1
    */
    
    

    list,each,while联合遍历数组
    eg:

    <?php
    $fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');
    
    reset($fruit);
    while (list($key, $val) = each($fruit)) {
        echo "$key => $val\n";
    }
    

    三、控制数组内部指针来控制函数遍历数组
    current() - 获取目前指针所指向资料的键值
    end() - 将数组的内部指针指向最后一个单元
    key() - 获取目前指针所指向资料的索引值
    each() - 返回数组中当前的键/值对并将数组指针向前移动一步
    prev() - 将数组的内部指针倒回一位
    reset() - 将数组的内部指针指向第一个单元
    next() - 将数组中的内部指针向前移动一位
    以上函数参数都只有一个,就是数组本身

    目前并未发现这个内部指针变动对foreach循环数组有什么影响,影响的可能只是each这些函数遍历数组。但是由于each使用较少,这些函数用处似乎并不是很大。

    四、预定义数组–超全局变量
    超全局变量是在全部作用域中始终可用的php内置变量。

    1、$_SERVER 
    服务器和执行环境信息
    2、$_GET、$_POST、$_REQUEST
    ①$_GET,通过 URL 参数传递给当前脚本的变量的数组,假设用户访问的是http://example.com/?name=Hannes那么
    echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!';将会输出Hello Hannes!
    ②$_POST,获取form表单post提交或者ajax的post提交等数据。
    ③$_REQUEST,默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。
    区别:
    ①get和post提交数据的方式不同
    ②GET方式提交数据安全性非常低,POST安全性较高,REQUEST获取数据较慢。
    ③get传送的数据量较小,这取决于URL长度,url长度http协议上没有限制,但是一般浏览器对其有限制,不同浏览器限制长度不同,另外服务器的操作系统也会有限制,如果url太长,服务器可能会因为安全方面的设置从而拒绝请求或者发生不完整的数据请求。post大小设置在php.ini中可以设置,post上传最大限制和文件最大上传大小限制post_max_size和upload_max_filesize
    $_FILES
    3、$_COOKIE、$_SESSION
    以下是初学php时对cookie、session的总结,由于cookie和session涉及知识点太多,暂时只做如下总结:
    session:其数据保存在服务器端。
    注意事项:在使用session之前要将session开启,并且一页面有且只有一个session_start()。在session_start()之前不能有任何输出,在顶部,与php标签不能有空格。可以重新赋值。一般php框架都做了这一步。
    ①session的写入:
    session_start();一般php框架对session使用做了封装
    在session_start写入之前不能有任何输出,一般放在页面最顶部。
    $_SESSION['']添加其数组的元素。
    ②session的清空                                                                     
    session_destroy();(清空所有已注册session)
    unset ($_SESSION[''])='';(清空指定的session)
    ③session的保存时间
       在php.ini中有一个配置项session.gc_maxlifetime设置的失效时间是指,保存session的文件“最后修改时间”到”现在”超过了gc_maxlifetime设置值,那么此时session失效。简单的说,如果我登录到某网站,如果在1440秒(默认值)内没有操作过,那么对应的session就认为是过期了。
       当然session保存时间没有这么简单,session回收机制,程序中对其时间作出修改,或者对其session文件做定时更新什么的。
    ④session保存地址
       在php.ini里的配置session.save_path默认是注释掉的,Seesion保存的路径
    	Linux:/tmp 或 /var/lib/php/session
    	Windows:C:\WINDOWS\Temp
    cookie
    ①写入
    不能用数组的形式定义:$_COOKIE['username']='sky';
    setcookie('cookie名','值','保存时间(时间戳)');
    时间戳:time():自1970年1月1日0时0分0秒到现在的秒数
    setcookie('username','sky','time()+60*60*24');
    ②读取
    print_r($_COOKIE);//一般php框架对cookie的使用做了封装
    ③销毁
    (1)setcookie('username','',0)将cookie过期时间设置为0
    (2)不能用unset($_COOKIE['username'])销毁;
    ④特点
    (1)cookie有时间限制,一般较长
    (2)cookie保存在客户端,保存在每一个浏览器的下面
    (3)只要未过有效时间或未被清除,是可以继续使用的。安全性较低
    
    4、$_ENV
    包含服务器端环境变量的数组,默认情况下,$_ENV为空,因为在php.ini中variables_order = "GPCS",前面少了个E
    EGPCS是Environment、Get、Post、Cookies、Server的缩写,如果variables_order 的配置中缺少E ,则PHP 无法
    接受环境变量,那么$_ENV 也就为空了。
    由于开启$_ENV,即variables_order = "EGPCS"会导致一些性能损失,不推荐使用。更推荐使用getenv (string $varname)
    函数来获取Environment中的值,getenv的参数就是$_ENV中的键名,可以通过phpinfo();来查看,搜索Apache Environment
    就可看到。
    
    5、$GLOBALS
    一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
    <?php
    function test() {
        $foo = "1";
        echo '$foo = ' . $GLOBALS["foo"] . "\n";
        echo '$foo = ' . $foo . "\n";
    }
    $foo = "2";
    test();//输出2 1
    
    

    浏览器禁用cookie,能否使用session
    当php.ini中的session.use_cookie=1(sessionid在客户端采用的存储方式,置1代表使用cookie记录客户端的sessionid,同时,$_COOKIE变量里才会有$_COOKIE[‘PHPSESSIONID’]这个元素存在)时,浏览器禁用cookie后,是不能使用session的,这个说法也非绝对,在程序中可以让其可以使用,说明如下:

    Created with Raphaël 2.2.0第一次访问网站服务端脚本中开启Session,session_start();服务端生成一个不重复的SESSIONID的文件session_id();返回含有如下HTTP头 Set-Cookie:PHPSESSIONID=xxxxxxx客户端接收到Set-Cookie的头,将PHPSESSIONID写入cookie第二次访问,所有Cookie会附带着请求头发送给服务端服务端根据cookie中PHPSESSIONID的值,去session目录查找对应session文件找到这个session文件后,检查是否过期,若未过期,读取该Session文件中的配置;若已过期,清空其中的配置

    根据以上流程,当禁用cookie后(此时,服务端因为没有得到PHPSESSIONID的cookie,会不停的生成session_id文件),PHPSESSIONID都无法生成,自然无法使用session。另外http头部信息可以用getallheaders()函数查看。
    但是,在代码中,如果一个Cookie都没接收到,那么代码可以预判客户端禁用了Cookie,那将session_id附带在每个网址后面(包括POST),eg:

    GET http://www.xx.com/index.php?session_id=xxxxx
    POST http://www.xx.com/post.php?session_id=xxxxx
    

    然后在每个页面的开头使用session_id($_GET['session_id']),来强制设置当前session_id,由此,又是可以使用session的。

    附:
    在php.ini中session.use_trans_sid=1 ,表示当客户端浏览器禁止cookie的时候,页面上的链接会基于url传递SESSIONID。但是很多人仅仅设置了这一个选项并没有达到效果。
    php.ini 文件中还有两个选项
    session.use_cookies=1
    session.use_only_cookies=1

    session.use_cookies表示是否开始基于cookies的session会话
    session.use_only_cookies 表示是否只开启基于cookies的session的会话方式

    就是说如果session.use_trans_sid=1并且客户端浏览器禁止cookie的时候,达不到效果,就要注意session.use_only_cookies的值是否为0

    展开全文
  • 在OpenGL ES中指定顶点数据可以使用一个顶点数组对每个顶点指定,例如顶点位置信息 ,也可以将一个常量值用于一个图元的所有顶点,例如图元的颜色。即常量顶点属性和顶点数组

    在OpenGL ES中指定顶点数据可以使用一个顶点数组对每个顶点指定,例如顶点位置信息 ,也可以将一个常量值用于一个图元的所有顶点,例如图元的颜色。

    即常量顶点属性和顶点数组。


    常量顶点属性

    我们使用glVertexAttrib*命令来加载 index 指定的通用顶点属性。


    顶点数组

    顶点数组指定每个顶点的属性,是保存在应用程序地址空间的缓冲区。使用 glVertexAttribPointer 和 glVertexAttribIPointer 来指定。

    分配和存储顶点数据有两种常用的方法,结构数组数组结构


    结构数组:在一个缓冲区中,把每个顶点的多种属性作为一个结构,多个结构以数组的形式存储在缓冲区中。

    数组结构:把多个顶点的每种顶点属性提取出来,不同的顶点属性分开存储在不同顶点属性的缓冲区中,然后组成一个结构。


    用一张简图来表示结构数组和数组结构的区别:



    下面在代码中来观察结构数组和数组结构的不同使用表现:

    结构数组

    #define  VERTEX_POS_SIZE 3 //x,y,z
    #define  VERTEX_NORMAL_SIZE 3 //x,y,z
    #define  VERTEX_TEXCOORD0_SIZE 2 //s and t
    #define  VERTEX_TEXCOORD1_SIZE 2 //s and t
    
    #define VERTEX_POS_INDEX 0
    #define  VERTEX_NORMAL_INDEX 1
    #define  VERTEX_TEXCOORD0_INDEX 2
    #define  VERTEX_TEXCOORD1_INDEX 3
    
    #define  VERTEX_POS_OFFSET 0
    #define  VERTEX_NORMAL_OFFSET 3
    #define  VERTEX_TEXCOORD0_OFFSET 6
    #define  VERTEX_TEXCOORD1_OFFSET 8
    
    #define  VERTEX_ATTRIBUTE_SIZE (VERTEX_POS_OFFSET+VERTEX_NORMAL_OFFSET+VERTEX_TEXCOORD0_OFFSET+VERTEX_TEXCOORD1_OFFSET)
    
    
    //假设有1000个Vertex;
    int numVertices=1000;
    float* p=(float*)malloc(numVertices*VERTEX_ATTRIBUTE_SIZE*sizeof(float));
    
    //设置顶点位置属性;
    glVertexAttribPointer(VERTEX_POS_INDEX,VERTEX_POS_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p);
    
    //设置顶点法线属性;
    glVertexAttribPointer(VERTEX_NORMAL_INDEX,VERTEX_NORMAL_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p+VERTEX_NORMAL_OFFSET);
    
    //设置TexCoord0;
    glVertexAttribPointer(VERTEX_TEXCOORD0_INDEX,VERTEX_TEXCOORD0_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p+VERTEX_TEXCOORD0_OFFSET);
    
    //设置TexCoord1;
    glVertexAttribPointer(VERTEX_TEXCOORD1_INDEX,VERTEX_TEXCOORD1_SIZE,GL_FLOAT,GL_FALSE,VERTEX_ATTRIBUTE_SIZE*sizeof(float),p+VERTEX_TEXCOORD1_OFFSET);
    

    数组结构:

    #define  VERTEX_POS_SIZE 3 //x,y,z
    #define  VERTEX_NORMAL_SIZE 3 //x,y,z
    #define  VERTEX_TEXCOORD0_SIZE 2 //s and t
    #define  VERTEX_TEXCOORD1_SIZE 2 //s and t
    
    #define VERTEX_POS_INDEX 0
    #define  VERTEX_NORMAL_INDEX 1
    #define  VERTEX_TEXCOORD0_INDEX 2
    #define  VERTEX_TEXCOORD1_INDEX 3
    
    #define  VERTEX_POS_OFFSET 0
    #define  VERTEX_NORMAL_OFFSET 3
    #define  VERTEX_TEXCOORD0_OFFSET 6
    #define  VERTEX_TEXCOORD1_OFFSET 8
    
    #define  VERTEX_ATTRIBUTE_SIZE (VERTEX_POS_OFFSET+VERTEX_NORMAL_OFFSET+VERTEX_TEXCOORD0_OFFSET+VERTEX_TEXCOORD1_OFFSET)
    
    
    //假设有1000个Vertex;
    int numVertices=1000;
    
    /********* 数组结构 Start ******/
    
    float* position=(float*)malloc(numVertices*VERTEX_POS_SIZE*sizeof(float));
    float* normal=(float*)malloc(numVertices*VERTEX_NORMAL_SIZE*sizeof(float));
    float* texcoord0=(float*)malloc(numVertices*VERTEX_TEXCOORD0_SIZE*sizeof(float));
    float* texcoord1=(float*)malloc(numVertices*VERTEX_TEXCOORD1_SIZE*sizeof(float));
    
    glVertexAttribPointer(VERTEX_POS_INDEX,VERTEX_POS_SIZE,GL_FLOAT,GL_FALSE,VERTEX_POS_SIZE*sizeof(float),position);
    glVertexAttribPointer(VERTEX_NORMAL_INDEX,VERTEX_NORMAL_SIZE,GL_FLOAT,GL_FALSE,VERTEX_NORMAL_SIZE*sizeof(float),normal);
    glVertexAttribPointer(VERTEX_TEXCOORD0_INDEX,VERTEX_TEXCOORD0_SIZE,GL_FLOAT,GL_FALSE,VERTEX_TEXCOORD0_SIZE*sizeof(float),texcoord0);
    glVertexAttribPointer(VERTEX_TEXCOORD1_INDEX,VERTEX_TEXCOORD1_SIZE,GL_FLOAT,GL_FALSE,VERTEX_TEXCOORD1_SIZE*sizeof(float),texcoord1);
    
    
    /********* 数组结构 End ******/

    因为在结构数组中,每个定点的属性数据可以顺序方式读取,所以在大部分情况下,使用结构数组更高效
    展开全文
  • 题目:用数组结构实现大小固定的队列和栈 一、数组实现栈结构: 栈结构是先进后出的,只需要一个数组和一个记录位置的变量size,当进来一个元素,size就++,出去一个元素size就-- public class ArrayStack{ ...

    题目:用数组结构实现大小固定的队列和栈

    一、数组实现栈结构:

            栈结构是先进后出的,只需要一个数组和一个记录位置的变量size,当进来一个元素,size就++,出去一个元素size就--

     

    public class ArrayStack{
            private Integer[] arr;
            private Integer   size;
    
            /**
             *  栈初始化
             * @param initSize 初始化数组容量
             */
            public ArrayStack(int initSize){
                if (initSize<0)
                    throw  new  IllegalArgumentException("参数不合理!");
                arr=new Integer[initSize];
                size=0;
            }
    
            /**
             * @Description: 返回栈顶元素
             * @return:  栈空 返回null 栈不空 返回栈顶元素
             * @date: 2019/4/23 10:12
             */
            public Integer peek(){
                if (size==0)
                    return null;
                Integer num = arr[size - 1];
                return num;
            }
    
            /**
             * @Description: 压栈操作
             * @param:    待压入元素
             * @date: 2019/4/23 10:15
             * @throws:  栈满时,抛出数组越界异常
             */
            public void push(int obj){
                if (size==arr.length)
                    throw new ArrayIndexOutOfBoundsException("栈满,无法压入!");
                arr[size++]=obj;
            }
    
            /**
             * @Description: 弹栈操作
             * @return:  返回栈顶元素 并数量减一
             * @date: 2019/4/23 10:19
             * @throws :  栈空时抛出数组越界异常
             */
            public Integer pop(){
                if (size==0)
                    throw new ArrayIndexOutOfBoundsException("栈空,无法弹栈!");
                return arr[--size];
            }
        }
    

    二、.实现队列结构:相对栈结构麻烦一些,队列要求先进先出,本案例中设置一个数组和三个变量,size用于记录元素总数,last记录刚进来的元素应该放在哪个位置即队尾,first表示用户要求弹出的元素所在的位置即队首。或许有些同学会觉得size是多余的,完全可以不要。但是size的作用并不仅仅是记录总数,它还有一个作用是使得last与first解耦,避免在一些代码中的一些麻烦。

    public class Code_01_Array_To_Stack_Queue {
    
        public static class ArrayStack{
            private Integer[] arr;
            private Integer   size;
    
            /**
             *  栈初始化
             * @param initSize 初始化数组容量
             */
            public ArrayStack(int initSize){
                if (initSize<0)
                    throw  new  IllegalArgumentException("参数不合理!");
                arr=new Integer[initSize];
                size=0;
            }
    
            /**
             * @Description: 返回栈顶元素
             * @return:  栈空 返回null 栈不空 返回栈顶元素
             * @date: 2019/4/23 10:12
             */
            public Integer peek(){
                if (size==0)
                    return null;
                Integer num = arr[size - 1];
                return num;
            }
    
            /**
             * @Description: 压栈操作
             * @param:    待压入元素
             * @date: 2019/4/23 10:15
             * @throws:  栈满时,抛出数组越界异常
             */
            public void push(int obj){
                if (size==arr.length)
                    throw new ArrayIndexOutOfBoundsException("栈满,无法压入!");
                arr[size++]=obj;
            }
    
            /**
             * @Description: 弹栈操作
             * @return:  返回栈顶元素 并数量减一
             * @date: 2019/4/23 10:19
             * @throws :  栈空时抛出数组越界异常
             */
            public Integer pop(){
                if (size==0)
                    throw new ArrayIndexOutOfBoundsException("栈空,无法弹栈!");
                return arr[--size];
            }
        }
    
        public static class ArrayQueue{
            private Integer[] arr;
            private Integer size;
            private Integer first;
            private Integer last;
    
            public ArrayQueue(int arrSize){
                if (arrSize==0)
                    throw new IllegalArgumentException("参数非法!");
                arr = new Integer[arrSize];
                size=0;
                first=last=0;
            }
            /**
             * @Description: 返回队首元素
            */
            public Integer peek(){
                if (size==0)
                    return null;
                return arr[first];
            }
    
            public void push(int obj){
                if (size==arr.length)
                    throw new ArrayIndexOutOfBoundsException("队满!");
                size++;
                arr[last]=obj;
                last= last==arr.length-1 ? 0 : last+1;
            }
    
            public Integer poll(){
                if (size==0)
                    throw  new ArrayIndexOutOfBoundsException("队空!");
                size--;
                int temp=first;
                first = first == arr.length-1 ? 0 : first+1;
                return  arr[temp];
            }
    
        }

     

     

    展开全文
  • 柔性数组结构成员

    千次阅读 2007-04-11 14:07:00
    【柔性数组结构成员 C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其 他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的...
    【柔性数组结构成员
      C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其 他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。】
    C语言大全,“柔性数组成员”

    【柔性数组结构成员
      C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其 他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。】
    C语言大全,“柔性数组成员”

    看看 C99 标准中 灵活数组成员:

    结构体变长的妙用——0个元素的数组
    有时我们需要产生一个结构体,实现了一种可变长度的结构。如何来实现呢?
    看这个结构体的定义:
    typedef struct st_type
    {
    int nCnt;
    int item[0];
    }type_a;
    (有些编译器会报错无法编译可以改成:)
    typedef struct st_type
    {
    int nCnt;
    int item[];
    }type_a;
    这样我们就可以定义一个可变长的结构,用sizeof(type_a)得到的只有4,就是sizeof(nCnt)=sizeof(int)那

    个0个元素的数组没有占用空间,而后我们可以进行变长操作了。
    C语言版:
    type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
    C++语言版:
    type_a *p = (type_a*)new char[sizeof(type_a)+100*sizeof(int)];
    这样我们就产生了一个长为100的type_a类型的东西用p->item[n]就能简单地访问可变长元素,原理十分简单

    ,分配了比sizeof(type_a)多的内存后int item[];就有了其意义了,它指向的是int nCnt;后面的内容,是没

    有内存需要的,而在分配时多分配的内存就可以由其来操控,是个十分好用的技巧。
    而释放同样简单:
    C语言版:
    free(p);
    C++语言版:
    delete []p;
    其实这个叫灵活数组成员(fleible array member)C89不支持这种东西,C99把它作为一种特例加入了标准。但

    是,C99所支持的是incomplete type,而不是zero array,形同int item[0];这种形式是非法的,C99支持的

    形式是形同int item[];只不过有些编译器把int item[0];作为非标准扩展来支持,而且在C99发布之前已经有

    了这种非标准扩展了,C99发布之后,有些编译器把两者合而为一。
    下面是C99中的相关内容:
    6.7.2.1 Structure and union specifiers

    As a special case, the last element of a structure with more than one named member may have

    an incomplete array type; this is called a flexible array member. With two exceptions, the

    flexible array member is ignored. First, the size of the structure shall be equal to the offset

    of the last element of an otherwise identical structure that replaces the flexible array member

    with an array of unspecified length.106) Second, when a . (or ->) operator has a left operand

    that is (a pointer to) a structure with a flexible array member and the right operand names that

    member, it behaves as if that member were replaced with the longest array (with the same element

    type) that would not make the structure larger than the object being accessed; the offset of the

    array shall remain that of the flexible array member, even if this would differ from that of the

    replacement array. If this array would have no elements, it behaves as if it had one element but

    the behavior is undefined if any attempt is made to access that element or to generate a pointer

    one past it.
    例如在VC++6里使用两者之一都能通过编译并且完成操作,而会产生warning C4200: nonstandard extension

    used : zero-sized array in struct/union的警告消息。
    而在DEVCPP里两者同样可以使用,并且不会有警告消息。
    展开全文
  • 迭代器方法在上篇中,我们探讨了很多数组方法,接下来总结一下最后一组方法——迭代器方法。这些方法对数组的每个元素应用一个函数,可以返回一个值、一组值、或者一个新数组。1、不生成新数组的迭代器方法以下这组...
  • 数据结构(数组结构、链表结构)

    千次阅读 2018-02-05 16:30:20
    本来第一篇文章准备写点关于map的,但是考虑到map中可能也牵扯到数据结构,所以先随便写点就当做铺垫吧! 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 1.集合 数据结构中的...
  • nginx源码分析—数组结构ngx_array_t

    万次阅读 多人点赞 2011-07-12 07:34:16
    本博客(http://blog.csdn.net/livelylittlefish... 数组结构1.1 ngx_array_t结构1.2 ngx_array_t的逻辑结构2. 数组操作2.1 创建数组2.2 销毁数组2.3 添加1个元素3. 一个例子3.1 代码3.2 如何编译3.3 运行结果4. 小结0.
  • 链表结构与数组结构有什么异同?

    千次阅读 2017-04-27 11:06:34
    数组是顺序的存储结构。链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;数组寻找某个...
  • C/C++柔性数组结构成员

    万次阅读 2012-02-29 18:10:00
    C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其 他成员。柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组...
  • 彩色图像和三维数组结构分析

    千次阅读 2019-07-07 17:53:43
    图像处理没打好基础,很容易犯这样一个误区:灰度图像是二维的,彩色图像是三维的,然后以为彩色图像在储存时是和三维数组的储存方式一样的。然后在对图像进行元素处理时老是犯错误或者慢人一拍。下面直接上程序了。...
  • C++中灵活数组结构使用

    千次阅读 2012-12-14 09:00:00
    C99中结构中的最后一个元素是未知大小的数组称为灵活数据结构成员,但是结构中的灵活数组成员前面必须至少有一个其它成员。灵活数组成员也许结构中包含一个可变大小的数组。这种结构的sizeof返回大小不包含灵活数组...
  • 编译原理——数组结构的翻译

    千次阅读 2018-07-25 19:29:06
    我们在这篇文章中只讨论静态数组的翻译,也就是在编译之前就已经确切知道大小的数组。并且我们把数组的下界定为1,也就是说数组下标是从1开始逐渐增长的。 A(1,1) A(1,2) A(1,3) A(1,4) A(2,1) A(2,2...
  • var pub = { treeTransArray: function(tree, key) { return tree.reduce( ... //输出转换后数组 console.log(arr); var _tree = pub.arrayTransTree(arr,'pid');//输出转换后树 console.log(_tree);
  • Nginx的内存管理都是围绕内存池来实现的,包括array数组类型也是基于Nginx的pool来实现数据结构。 Nginx的Array结构设计得非常小巧,主要用于存储小块内存。Nginx的数组每个元素的大小是固定的。 数据结构定义 ngx...
  • 简单的说下树形数据的结构:"type": "logic", "content": "and", "left": { "type": "leaf", "content": "=", "left": "ID", "right": "123" }, "right": { "type": "leaf", "content": "~", "left":
  • 1, id: 5, value: '5' }] 转为这样的一个结构的数据: [ { id: 0, childrens: [ { parentId: 0, id: 1, value: '1', childrens: [ { parentId: 1, id: 4, value: '4' }, { parentId: 1, id: 5, value: '5' } ] }, {...
  • 如何在C#中定义动态的数组结构啊??比如 public struct mystruct {public string word;public int length;}类似这样的结构,可以动态增加的结构数组?
  • 队列的C语言实现(循环数组结构

    千次阅读 2016-07-06 22:46:42
    //队列的循环数组实现 #include #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef int ElementType; typedef struct _QUEUE_ARRAY_{...
  • 这是我的小程序简单效果图每一个panel 是一个类别 每次点击查看更多 需要调用接口刷新当前类别的数据因为这是分类是一个数据 于是我定义成一个data 数组data: { category_list:[ { id: 1, name: '阅读', show: ...
  • 2.创建数组结构 示例1.局部数组 先逐步分析: 修正函数 对应逆向代码如下 void *sub_401000() { void *result; // eax@1 int i; // [sp+0h] [bp-194h]@1 int array_int[100]; // [sp+...
  • 结构数组

    千次阅读 2019-10-24 15:52:46
    结构数组 结构数组是对某个对象,不同属性的数据,用一组数据来表示,称为结构数组结构数组中的元素可以是数值也可以是字符串。MATLAB有关结构数组的函数,如下: struct 创建结构数组 fieldname 提取结构数组字段...
  • 数组结构 ,函数指针,指针函数,数组指针,指针数组结构指针的定义和实现 数组 结构 ////////////// 函数指针 指针函数 ////////////// 数组指针 指针数组 ////////////// 结构指针
  • c语言数据结构数组修改数组An array is a data structure for storing elements of one data type sequentially. The elements of an array are allocated at the adjacent memory location. Each element of an ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,292,509
精华内容 517,003
关键字:

数组结构