2020-11-01

本文围绕字符串常量展开,介绍编译器会为字符串自动添加结束符。阐述了字符串作为字符数组初始值和赋给字符指针变量时,分别不是常量和是常量的情况。还说明了数组类型的决定因素、字符串常量类型、sizeof的作用、函数参数列表中数组形式参数的解释,并通过实例进行了实战分析。

1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写
  "abc",那么编译器帮你存储的是"abc\0"

2."abc"是常量吗?答案是有时是,有时不是。

  不是常量的情况:"abc"作为字符数组初始值的时候就不是,如
                  char str[] = "abc";
    因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而又因为
    字符数组就是把字符一个一个地存放的,所以编译器把这个语句解析为
    char str[3] = {'a','b','c'};
                  又根据上面的总结1,所以char str[] = "abc";的最终结果是
    char str[4] = {'a','b','c','\0'};
    做一下扩展,如果char str[] = "abc";是在函数内部写的话,那么这里
    的"abc\0"因为不是常量,所以应该被放在栈上。
  
  是常量的情况:  把"abc"赋给一个字符指针变量时,如
                  char* ptr = "abc";
    因为定义的是一个普通字符指针,并没有定义空间来存放"abc",所以编译器得帮我们
    找地方来放"abc",显然,把这里的"abc"当成常量并把它放到程序的常量区是编译器
    最合适的选择。所以尽管ptr的类型不是const char*,并且ptr[0] = 'x';也能编译
    通过,但是执行ptr[0] = 'x';就会发生运行时异常,因为这个语句试图去修改程序
    常量区中的东西。
    记得哪本书中曾经说过char* ptr = "abc";这种写法原来在c++标准中是不允许的,
    但是因为这种写法在c中实在是太多了,为了兼容c,不允许也得允许。虽然允许,
    但是建议的写法应该是const char* ptr = "abc";这样如果后面写ptr[0] = 'x'的
    话编译器就不会让它编译通过,也就避免了上面说的运行时异常。
    又扩展一下,如果char* ptr = "abc";写在函数体内,那么虽然这里的"abc\0"被
    放在常量区中,但是ptr本身只是一个普通的指针变量,所以ptr是被放在栈上的,
    只不过是它所指向的东西被放在常量区罢了。

3.数组的类型是由该数组所存放的东西的类型以及数组本身的大小决定的。
  如char s1[3]和char s2[4],s1的类型就是char[3],s2的类型就是char[4],
  也就是说尽管s1和s2都是字符数组,但两者的类型却是不同的。

4.字符串常量的类型可以理解为相应字符常量数组的类型
  如"abcdef"的类型就可以看成是const char[7]

5.sizeof是用来求类型的字节数的。如int a;那么无论sizeof(int)或者是sizeof(a)都
  是等于4,因为sizeof(a)其实就是sizeof(type of a)

6.对于函数参数列表中的以数组类型书写的形式参数,编译器把其解释为普通
  的指针类型,如对于void func(char sa[100],int ia[20],char *p)
  则sa的类型为char*,ia的类型为int*,p的类型为char*


7.根据上面的总结,来实战一下:
  对于char str[] = "abcdef";就有sizeof(str) == 7,因为str的类型是char[7],
  也有sizeof("abcdef") == 7,因为"abcdef"的类型是const char[7]。
  对于char *ptr = "abcdef";就有sizeof(ptr) == 4,因为ptr的类型是char*。
  对于char str2[10] = "abcdef";就有sizeof(str2) == 10,因为str2的类型是char[10]。
  对于void func(char sa[100],int ia[20],char *p);
  就有sizeof(sa) == sizeof(ia) == sizeof(p) == 4,
  因为sa的类型是char*, ia的类型是int*,p的类型是char*。

 https://blog.youkuaiyun.com/yichu5074/article/details/81701850

 

数组名是一个常量地址,不可以改变,而指针是可以改变的。所以当 char str[] = "abc";时候, "abc"就是临时字符串,用来初始化str数组;当char* ptr = "abc";时候,ptr是一个指针,本身只是一个门牌号不具备贮存东西的条件,所以需要将 "abc"放到常量去保存下来,ptr指向了那个常量区,所以执行ptr[0] = 'x';就会发生运行时异常。常量区,const不能改变

 

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
<think>好的,我现在需要帮助用户解决在Google Earth Engine中使用Inspector工具查看爱荷华州Sentinel-1数据的VH波段,并限定日期范围的问题。首先,我得回顾用户提供的引用内容,看看有没有相关的代码或步骤可以参考。引用[1]中提到了如何下载Sentinel-1数据,包括选择波段和导出设置。引用[2]则涉及到影像的合成和展示问题,这可能与显示数据有关。 用户的具体需求是使用Inspector工具显示特定区域和时间的VH波段数据。首先,我需要确定在GEE中如何加载Sentinel-1数据集,并过滤日期和区域。根据引用[1]中的代码,用户使用了`ee.Image.load`来加载单张影像,但这里可能需要使用`ee.ImageCollection`来筛选时间范围。 接下来,我需要确保选择的是VH波段。在引用[1]的代码中,有注释掉的`image.select("VH")`,这可能意味着用户需要显式地选择该波段。此外,日期过滤应该使用`filterDate`方法,而区域过滤则需要定义爱荷华州的几何范围,可以使用GEE提供的FeatureCollection或用户自己上传的几何。 然后,关于Inspector工具的使用,用户需要知道在Map界面中如何点击Inspector,然后在地图上点击位置来查看像素值。同时,可能需要将筛选后的影像添加到地图中,并设置合适的可视化参数,比如min和max,以确保图像正确显示。引用[1]中的`Map.addLayer`部分有设置min和max的例子,这可以作为参考。 另外,需要注意Sentinel-1数据的类型,比如是GRD还是其他,可能需要过滤`instrumentMode`为'IW'或者其他合适的模式,以确保数据正确。此外,考虑到 Sentinel-1有不同极化方式,用户需要VH,所以需要检查极化参数。 可能的问题包括日期过滤后的数据是否存在,区域是否覆盖爱荷华州,以及是否正确选择波段。需要确保代码中没有错误,比如变量名是否正确,过滤条件是否准确。此外,影像的可视化参数设置不当可能导致图像无法显示,这也是需要注意的地方。 最后,用户可能需要导出或进一步处理数据,但当前问题集中在使用Inspector查看,因此重点应放在加载、过滤、显示数据以及使用Inspector工具上。可能需要分步骤指导用户如何操作,并验证每个步骤是否正确执行。</think>以下是在Google Earth Engine中使用Inspector工具查看爱荷华州Sentinel-1 VH波段数据的完整步骤: ```javascript // 步骤1:定义研究区域和时间范围 var iowa = ee.FeatureCollection("TIGER/2018/States") .filter(ee.Filter.eq('NAME', 'Iowa')); var startDate = '2020-04-01'; var endDate = '2020-11-01'; // 步骤2:加载Sentinel-1数据集并筛选 var s1 = ee.ImageCollection('COPERNICUS/S1_GRD') .filterBounds(iowa) .filterDate(startDate, endDate) .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VH')) .select('VH'); // 步骤3:设置可视化参数 var visParams = { min: -25, max: 5, palette: ['0000FF', 'FFFFFF', 'FF0000'] }; // 步骤4:将影像添加到地图 Map.centerObject(iowa, 7); Map.addLayer(s1.mean().clip(iowa), visParams, 'Sentinel-1 VH Mean'); // 步骤5:使用Inspector工具查看 /* 1. 点击右侧工具栏的"Inspector"图标 2. 点击地图任意位置查看该点的VH波段值 3. 信息将显示在Inspector面板中,包含: - 像素值 - 坐标信息 - 影像日期(当多时相数据叠加时) */ ``` 关键参数说明: 1. 极化过滤使用`listContains`确保包含VH波段[^1] 2. `clip(iowa)`限制显示范围为爱荷华州边界 3. `mean()`对时相数据取均值,避免多影像叠加冲突 $$ \text{数据量估算公式} = \frac{\text{研究区面积}}{\text{分辨率}^2} \times \text{时间序列长度} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值