精华内容
下载资源
问答
  • //零字节数组 } #pragma pack() 参考资料: 到此这篇关于C语言变长数组使用详解的文章就介绍到这了,更多相关C语言变长数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    看如下代码:

    #include

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    int main() {

    int len = 10;

    printf("The struct's size is %d\n",sizeof(SoftArray));

    return 0;

    }

    运行结果:

    [root@VM-0-7-centos mydoc]# ./a.out

    The struct's size is 4

    我们可以看出,_SoftArray结构体的大小是4,显然,在32位操作系统下一个int型变量大小刚好为4,也就说结构体中的数组没有占用内存。为什么会没有占用内

    存,我们平时用数组时不时都要明确指明数组大小的吗?但这里却可以编译通过呢?这就是我们常说的动态数组,也就是变长数组。

    先不要乱,让我们再看一段代码

    #include

    #include

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    int main() {

    int len = 10;

    SoftArray *p=(SoftArray*)malloc(sizeof(SoftArray) + sizeof(int)*len);

    printf("SoftArray size is %d\n", sizeof(SoftArray));

    free(p);

    return 0;

    }

    运行结果:

    [root@VM-0-7-centos mydoc]# ./a.out

    SoftArray size is 4

    是不是有点奇怪,为什么申请了内存后结构体大小还是4呢?原因是动态申请的内存只是申请给数组拓展所用,从上个程序我们可以看出结构体的大小在创建时已经

    确定了,array明确来说不算是结构体成员,只是挂羊头卖狗肉而已。

    下面我们来看看关于变长数组的资料:

    1、什么是变长数组?

    变长数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建变长数组。

    2、变长数组有什么用途 ?

    它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。

    3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名

    本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们

    可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

    对于变长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    这样的变长数组常用于网络通信中构造不定长数据包,不会浪费空间浪费网络流量,比如我要发送1024字节的数据,如果用定长包,假设定长包的长度为2048,就

    会浪费1024个字节的空间,也会造成不必要的流量浪费。

    举个简单例子。

    #include

    #include

    typedef struct {

    int len;

    int array[];

    }SoftArray;

    int main() {

    int len=10, i=0;

    SoftArray *p=(SoftArray*)malloc(sizeof(SoftArray)+sizeof(int)*len);

    p->len=len;

    for(i = 0;i < p->len;i++) {

    p->array[i] = i+1;

    }

    for(i = 0;i < p->len;i++) {

    printf("%d\n", p->array[i]);

    }

    free(p);

    return 0;

    }

    运行结果:

    [root@VM-0-7-centos mydoc]# ./a.out

    注意,内存对齐字节偏移

    解决:资料【3】

    #pragma pack(1)

    struct node {

    int xxx;//4字节

    char yyy;//1字节

    char data[0];//零字节数组

    }

    #pragma pack()

    参考资料:

    到此这篇关于C语言变长数组使用详解的文章就介绍到这了,更多相关C语言变长数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • // 0 包含 从这可以看出数组使用indexOf区分类型(type) 总结: 数组项为数字或者字符串数字数组使用indexOf() 方法对类型也敏感。 (2)数组项为字符串 let arr=['abbc','b']; arr.indexOf('b') ; //1 包含 arr....

    一、定义和用法

    indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

    语法

    stringObject.indexOf(searchvalue,fromindex)
    参数描述
    searchvalue必需。规定需检索的字符串值。
    fromindex可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的首字符开始检索。

    说明

    该方法将从头到尾地检索字符串 stringObject,看它是否含有子串 searchvalue。开始检索的位置在字符串的 fromindex 处或字符串的开头(没有指定 fromindex 时)。如果找到一个 searchvalue,则返回 searchvalue 的第一次出现的位置。stringObject 中的字符位置是从 0 开始的。

    提示和注释

    注释:indexOf() 方法对大小写敏感!

    注释:如果要检索的字符串值没有出现,则该方法返回 -1。

    实例

    在本例中,我们将在 "Hello world!" 字符串内进行不同的检索:

    <script type="text/javascript">
    
    var str="Hello world!"
    document.write(str.indexOf("Hello") + "<br />")
    document.write(str.indexOf("World") + "<br />")
    document.write(str.indexOf("world"))
    
    </script>
    

    以上代码的输出:

    0
    -1
    6

    以上参考于w3cW3C indexOf用法

    二、字符串indexOf使用

    一、字符串使用indexOf很简单

    是否包含某传入的相同字符,不包含返回-1,包含则返回其下标(只返回包含的第一个下标);indexOf() 方法对大小写敏感!

    let arr=str="arra";
    str.indexOf('a') //结果为 0 包含  有两个a只返回第一个的下标
    str.indexOf('A') //结果为-1 不包含 对大小写敏感
    

    二、数组使用indexOf(前提是必须寻找整个项)

    (1)数组项为数字或者字符串数字

     我一直以为indexOf只适用于字符串,结果在之前的项目里看到数组也能使用很新奇,使用的方法及注意事项(踩坑)特此记录分享一下。

    let arr=['1','2','1'];
    arr.indexOf('1'); // 0 包含 只返回包含的第一个下标
    arr.indexOf(1); // -1 不包含  从这可以看出数组使用indexOf区分类型(type)
    arr.indexOf(String(1)); // 0 包含  从这可以看出数组使用indexOf区分类型(type)

    总结:

    数组项为数字或者字符串数字数组使用indexOf() 方法对类型也敏感。

    (2)数组项为字符串

    let arr=['abbc','b'];
    arr.indexOf('b') ; //1  包含
    arr.indexOf('B') ; //-1 不包含 说明对大小写依然敏感
    arr.indexOf('c') ; //-1 不包含 对比整个项(而不是一个项里找)注意不要误解:不要认为arr[0]='abbc' arr.indexOf('c') 它不会对一个项里查找

    总结:

    数组项为字符串数组使用indexOf() 方法对大小写敏感。

    使用场景:

    1.找出数组是否包含某一个值

       比如:arr =['abc','bb'];是否包含bb这一项

    let arr=['abc','bb'];
    arr.indexOf('bb'); //返回 1 包含(注意类型)
    
    if(arr.indexOf('bb')>-1){
      alert(包含)
    }

    一般项目中都会判断indexOf是否大于-1来判断是否包含。

     lastIndexOf和indexOf差不多,前者只是返回包含的最后一项标,后者是第一项下标。上面的也适用于lastIndexOf

    数组是否包含某个值,还可以使用includesfind。当然循环遍历判断也行(some,every,filter,map,for等);

    let arr=[1,,2,3]
    let a=false;
    arr.map((item)=>{
      if(item=='1'){
       a=true;
     }  
    })
    if(a){
     alert('包含')
    }

     

    展开全文
  • 最近有个功能突然有个需求,需要在yml配置文件里配置多条路径,需要动态获取配置文件里的参数,根据接口接收的参数判断,使用对应的配置 就了解到yml数组,遂记录 一、 yml数组形式 upload-record-paths: basepath:...

    前言

    最近有个功能突然有个需求,需要在yml配置文件里配置多条路径,需要动态获取配置文件里的参数,根据接口接收的参数判断,使用对应的配置

    就了解到yml数组,遂记录

    一、 yml数组形式

    upload-record-paths:
      basepath: filerecord
      list:
        - name: 111
          path: 111
        - name: 222
          path: 222
    

    其中对象对应Java元素结构为map,一个 “ - ” 代表一组,整体是一个List,因为@Value不支持取复杂对象且限制较多,除了一个值一个值的取,只能使用SpEL(后文有解释),所以我使用配置类的方式

    二、配置类取对象

    @Configuration
    @ConfigurationProperties(prefix = "upload-record-paths")
    @Data
    public class UploadRecordProperties {
        public static List<Map<String, String>> list;   //static 才能拿配置值
    }
    

    其中upload-record-paths为yml配置文件前缀,使用也很简单,代码中直接

    // 动态获取配置文件 - 或者使用@Autowried注入配置对象,通过get获取
    List<Map<String, String>> list = UploadRecordProperties.getList();
    
    String path = null;
        for (Map map : list){
              String name = (String) map.get("name");
              if (name.equalsIgnoreCase(fileType)){
                  path = recordbasepath + File.separator + (String) map.get("path") + File.separator + rocordId;
              }
          }
          if (StringUtils.isBlank(path)){
              // 没有对应类型
              return ResponseEntityResult.error("没有找到匹配的文件类型:" + fileType);
          }
    

    大概是以上流程。

    我个人有个参考使用方式可取出

    @Value("#{'${com.xxx.xxx-list:}'.empty ? null : '${com.xxx.xxx-list:}'.split(',')}")
        private List<String> list;
    

    对应的yml格式为

    # 通过,分隔使用的参数
    com:
    	xxx:
    		xxx-list: 
    	.dwt,.dwg,.dxf,.zip,.rar,.mxd
    

    文章发布一个月后,发现了一个博主的好文章解释了为啥能这样,晒这

    [@value 数组_SpringBoot @Value 读取配置,太强大了!](文章发布一个月后,发现了一个博主的好文章,晒这,能不使用配置类使用
    @value 数组_SpringBoot @Value 读取配置,太强大了!

    三、SpEL

    前面说到@Value取值限制较多,这是因为除了正常的一个个参数使用$获取,就只剩下SpEL的方式了。
    首先看看使用@Value和@ConfigurationProperties配置类的方式有什么不同

    图片来自参考文章
    图片来自参考文章

    我们可以看出使用@ConfigurationProperties配置类比@Value支持的方法多,其中松散绑定是

    比如说有个yml参数是 file-upload
    在配置类中可以写成file-upload或者fileUpload

    其他几种可以查看参考材料里的文章了解。

    四、参考材料

    这是第三部分的参考文章:spring boot 配置文件properties,yml语法学习及属性获取@ConfigurationProperties和@Value

    展开全文
  • 先把内层数组转成字符串,形成一个字符串数组,再转换外层数组 let a = [[1,2],[3,4]] let b = a.map((item) => { return item.join(',') }) console.log(b) // ["1,2", "3,4"] let c = b.join('|') console....

    思路:从内向外剥开,逐层地转换。先把内层数组转成字符串,形成一个字符串数组,再转换外层数组

    let a = [[1,2],[3,4]]
    let b = a.map((item) => {
         return item.join(',')
    })
    console.log(b)  // ["1,2", "3,4"]
    let c = b.join('|')
    console.log(c) // 1,2|3,4
    console.log(typeof c) // string

     

    展开全文
  • c++中数组使用

    2021-11-16 20:39:24
    在c++中,有三个强而有力的工具,分别是数组,指针还有字符串,可以说,没有熟练掌握这三个工具的不能算是一个合格的程序员。 1.数组 数组,实际上就是向系统申请一个连续的内存空间,每个内存空间的地址连续,...
  • 图1 第1步,创建char双指针变量bgFrames_path,并对他分配第一维内存;然后再对所有的第一维分配内存,创建二维指针数组; 第2步,创建临时的char一维数组... 第4步,传入参数使用。 最后记得释放内存; ...
  • 一、数组的简单介绍1.数组是一个对象,是任意类型对象地址的集合,OC的数组可以存储不同类型的对象2.OC的数组只能存储对象,不能存放 简单的数据类型(int, float, NSInteger…)除非通过一些手段把简单数据类型变成...
  • 截取前每一项: 截取后每一项: arr1.forEach((res,index)=>{ res.createTime = res.createTime.slice(0,10); }); console.log(arr1); //------做个记录而已
  • 数组就是一个长得像数组又length和[ ]成员但又不是真的数组,不能用数组傻瓜吗的方法比如push,shift 常见的伪数组时函数里面参数数组 arguments 以及DOM的子节点 真数组 //真数组 let a=[1,2,3,4,5,6,7] a.push...
  • 其中一个要求我设置一个数组来保存以下字符串值:Beyonce (f)David Bowie (m)Elvis Costello (m)Madonna (f)Elton John (m)Charles Aznavour (m)写一个程序循环,计数有多少男性歌手和多少是女性,并在控制台中显示...
  • 原因: 数组是引用类型,splice()会删除所引用的地址里面的值。(吐血。。。) 以前在Java中遇到的问题,没想到js也会有这种删除问题。。 解决办法 在父组件传值的时候不传原地址的参数,通过concat()函数复制一...
  • 1、数组的访问方法 下标法访问 指针法访问 实例一:一维数组 //一维数组 { //数组初始化 //int a[10]={0,1} //不完整初始化 //int a[]={0,1,2,3,4,5,6,7,8,9} //自动计算数组长度 int a[10]={0,1,2,3,4,5,6,7...
  • 02_Java二维数组使用

    2021-01-05 23:18:50
    二维数组使用 二维数组的理解 二维数组是一维数组数组 内存中并没有存在真正的二维数组,只不过是一维数组中装了一维数组 二维数组的声明和初始化 要想使用二维数组,首先要进行声明和初始化 二维数组的...
  • 1、求最值 int[] arr = {12,23,3,45555,22,10000}; int max = arr[0];...System.out.println("数组的最大值是:"+max); 2、猜数字 代码实现: // 1、定义数组 int[] nums = new int[5]; // 2、生成五个随机
  • Java中数组使用和注意事项

    千次阅读 2021-08-26 15:02:49
    为什么要使用数组? 当我们要存储大量相同类型的时候,通过配合循环来使用就会大量减少代码复杂程度 数组的特点: (1)数组是一种引用类型. (2)数组的长度是固定的. (3)数组中每个元素的类型都是相同的. ...
  • 很明显不可能,这时就要使用数组。结构体中也有数组,称为结构体数组。它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项...
  • 定义数组后,就是使用数组了。在使用数组时,只能引用单个数组元素,而不能一次引用整个数组数组元素的引用需要指定下标(下标从0开始,不能越界),形式为:数组名 [下标]; 下标可以是整型表达式。它的合理取值...
  • vue.js $set的使用 数组

    2021-01-30 13:52:54
    '}) vm.items.length = 0 失效 vm.items={} {{$data|json }} 因为 JavaScript 的限制,Vue.js 不能检测到下面数组变化: 直接用索引设置元素,如 vm.items[0] ={}; 修改数据的长度,如 vm.items.length= 0。
  • android中数组的定义可以直接在JAVA代码中声明,也可以在res->values目录下新建一个xml文件,作为数组资源进行声明字符数组可以有如下2种声明方式String[]或者是List代码如下:package com.example.listviewpractice...
  • 数组的声明与使用 数组的声明 数组的声明使用总共分为四个步骤 一、数组的声明 包括:数组名,数据类型,[] 二、为数组分配空间 必要,否则会出现错误 三、数组各元素的赋值 注意:数组的各元素必须与声明的数据...
  • C语言中数组的定义和使用

    千次阅读 2021-05-20 09:50:15
    一维数组的定义:类型说明符 数组名[常量表达式]; 注意:常量表达式包括常量与符号常量,不能包含变量。2.一维数组的引用:数组名[下标];3.一维数组的初始化:a.在定义数组时对数组元素赋以初值;b.可以只给一部分...
  • 数组是表示多个相同类型变量的集合(在一个数组中所存放的所有元素的类型必须一致),可以使用共同的名字引用它。 1、属于复杂数据类型 2、由类型相同的元素组成的有顺序的数据集合 3、Java数组是固定的不能扩展[长度...
  • clickhouse中数组使用

    2021-09-14 00:52:39
    需求如下: 表flight_sale_history: ...要求对flight_sale_history中的每一条记录,求出discount_cabin中折扣最接近的舱位数组的第一个舱位。 想法: 1. 将discount_cabin变成每个air_code一条记录,...
  • Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维数组对存储器进行建模。
  • 一、使用 数组指针类型 定义数组指针、 二、完整代码示例
  • 对于indexOf()的用法一直停留在查找第几个字符串,却不知道它能用到数组去重中,首先还是温顾下indexOf()的语法:Document/*语法:stringObject.indexOf(searchvalue,fromindex)searchvalue:必须。规定需检索的字符...
  • 数组对象去重使用Map

    2021-01-29 15:02:17
    var arr = [{ a: 1, d: 2 }, { a: 2, d: 3 }, { a: 3, d: 1 }, { a: 1, d: 6 }, { a: 2, d: 7 }, { a: 4, d: 8 }] let map = new Map() arr.forEach((item,index)=>
  • Java之二维数组基本使用

    千次阅读 2021-06-08 23:06:11
    二维数组 二维数组的应用场景 比如我们开发一个五子棋游戏,棋盘...1. 二维数组使用 快速入门案例:TwoDimensionalArray01.java 请用二维数组输出如下图形 0 0 0 0 0 0 0 0 1 0 0 0 0 2 0 3 0 0 0 0 0 0 0 0 ...
  • TS如何定义和使用对象数组

    千次阅读 2020-12-23 09:19:55
    展开全部数组的定义:1、类型 + 方括号:比如: 636f70793231313335323631343130323136353331333431373933let tsArray: number[] = [1,1,2,3,4]2、使用数组泛型Array来表示数组:比如:let fibonacci: Array = [1, ...
  • 我想解析JSON数组使用gson。首先,我可以记录JSON输出,服务器清楚地响应客户端。这是我的JSON输出:[{id : '1',title: 'sample title',....},{id : '2',title: 'sample title',....},...]我尝试了这种结构进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,060,605
精华内容 1,224,242
关键字:

数组的使用

友情链接: Bootloader_V1.3.zip