C语言高级用法---typeof()关键字

本文介绍了GUN C中typeof()特性,它可取得变量或表达式的类型。总结了其常见用法,如定义接收函数返回值的变量、在宏定义中动态获取结构体成员类型、直接取得已知类型等,并给出相应代码示例,虽未穷举所有情况,但涵盖核心用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

typeof() 是GUN C提供的一种特性,可参考C-Extensions,它可以取得变量的类型,或者表达式的类型。

本文总结了typeof()关键字的常见用法,并给出了相应的例子,以加深理解 。

typeof()关键字常见用法

typeof()关键字常见用法一共有以下几种。

  1. 不用知道函数返回什么类型,可以使用typeof()定义一个用于接收该函数返回值的变量

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct apple{
        int weight;
        int color;
    };
    
    struct apple *get_apple_info()
    {
        struct apple *a1;
        a1 = malloc(sizeof(struct apple));
        if(a1 == NULL)
        {
            printf("malloc error.\n");
            return;
        }
    
        a1->weight = 2;
        a1->color = 1;
    
        return a1;
    }
    
    int main(int argc, char *argv[])
    {
        typeof(get_apple_info()) r1;//定义一个变量r1,用于接收函数get_apple_info()返回的值,由于该函数返回的类型是:struct apple *,所以变量r1也是该类型。注意,函数不会执行。
    
        r1 = get_apple_info();
    
        printf("apple weight:%d\n", r1->weight);
        printf("apple color:%d\n", r1->color);
    
        return 0;
    }
    
  2. 在宏定义中动态获取相关结构体成员的类型

    如下代码,定义一个和变量x相同类型的临时变量_max1,定义一个和变量y相同类型的临时变量_max2,再判断两者类型是否一致,不一致给出一个警告,最后比较两者。

    #define max(x, y) ({                \
        typeof(x) _max1 = (x);          \
        typeof(y) _max2 = (y);          \
        (void) (&_max1 == &_max2);      \//如果调用者传参时,两者类型不一致,在编译时就会发出警告。
        _max1 > _max2 ? _max1 : _max2; })
    

    如下代码,传入的a和b不是同一类型。

    int main(int argc, char *argv[])
    {
        int a=3;
        float b = 4.0;
        int r = max(a, b);
    
        printf("r:%d\n", r);
    
        return 0;
    }
    

    此时编译就会出现警告

    [root@xx c_base]# gcc test.c
    test.c: 在函数‘main’中:
    test.c:43: 警告:比较不相关的指针时缺少类型转换
    
  3. 也可直接取得已知类型

    如下代码,定义了一个int类型的指针p,像这种用法主没什么太大的意义了。

        int a = 2;
        typeof (int *) p;
        p = &a;
        printf("%d\n", *p);
    
  4. 其它用法

	//其它用法1
	char *p1;
    typeof (*p1) ch = 'a'; //ch为char类型,不是char *类型。
    printf("%d, %c\n", sizeof(ch), ch);//1, a

	//其它用法2
	char *p2;
    typeof (p2) p = "hello world";//此时的p才是char *类型,由于在64位机器上,所以指针大小为8字节
    printf("%d, %s\n", sizeof(p), p);//8, hello world

总结

以上例子并没有穷举所有的情况,但其核心用法基本上就会了,其它的例子也可参考网上的例子。

参考文章

C语言中typeof()函数的用法

C-Extensions

<think>好的,用户想在ArcGIS或QGIS中对DEM进行重分类。首先,我需要回忆一下这两个软件中关于重分类的功能和步骤。记得在ArcGIS里,重分类通常是通过Spatial Analyst工具里的Reclassify工具完成的。而在QGIS中,可能使用的是Raster Calculator或者Reclassify by Table之类的插件或处理工具。 用户可能对DEM数据不太熟悉,所以需要先解释什么是重分类。重分类就是将栅格中的数值重新映射到新的类别或范围,比如将高程分成不同的等级,用于分析地形或制作地图。不过,用户已经提到了DEM,所以可能已经了解基本概念,但应用步骤是关键。 接下来,要分步骤说明在两个软件中的操作流程。对于ArcGIS,需要确保Spatial Analyst扩展模块已经启用,然后找到Reclassify工具,选择输入栅格,设置分类规则,比如手动划分间隔或使用分类方法(自然间断点、等间隔等),然后指定输出路径。需要提醒用户注意分类方法的适用场景,比如等间隔适合均匀分布的数据,而自然间断点则根据数据分布自动划分。 对于QGIS,可能步骤稍有不同。QGIS默认可能没有直接的Reclassify工具,但可以通过Raster Calculator使用条件语句来重新分类,或者安装Reclassify插件。比如使用GRASS GIS的r.reclass模块,或者SAGA GIS的重分类工具。需要详细说明每种方法的具体步骤,比如在Processing Toolbox里搜索相关工具,设置旧值到新值的映射表,或者使用表达式进行条件赋值。 另外,用户可能会遇到常见问题,比如分类后数据范围不正确,或者输出结果不显示。这时候需要检查输入数据的值域,确认分类规则是否正确覆盖了所有可能的值,或者检查是否忽略了某些特殊值(如Nodata)。此外,输出格式的选择也可能影响结果,建议使用GeoTIFF等常见格式以确保兼容性。 还要考虑用户的实际应用场景。例如,重分类可能用于洪水模拟,将高程分为淹没区和非淹没区;或者用于土地利用规划,划分不同的坡度等级。不同的应用可能需要不同的分类策略,因此提供一些实例会有帮助。 最后,生成相关问题时,需要围绕DEM处理的其他操作,比如坡度计算、山体阴影生成,或者与其他软件的比较,比如如何选择ArcGIS和QGIS进行这类操作。可能还要涉及数据预处理步骤,比如如何纠正DEM中的错误或填补缺失值。</think>### 如何在 ArcGIS 或 QGIS 中对 DEM 进行重分类? #### **ArcGIS 操作步骤** 1. **启用 Spatial Analyst 扩展** 打开 ArcMap 或 ArcGIS Pro,依次点击 `Customize > Extensions`,勾选 `Spatial Analyst`[^1]。 2. **打开重分类工具** 在 `Toolbox` 中导航至 `Spatial Analyst Tools > Reclass > Reclassify`。 3. **设置参数** - 输入栅格:选择 DEM 数据。 - 分类方法:支持手动划分区间或自动分类(如自然间断点、等间隔)。 - 输出栅格:指定保存路径。 ```python # 示例:通过代码调用工具 arcpy.Reclassify_3d("dem.tif", "VALUE", "0 500 1;500 1000 2;1000 1500 3", "output_reclass.tif") ``` 4. **验证结果** 检查输出栅格的属性表,确认高程值已按规则映射到新类别。 --- #### **QGIS 操作步骤** 1. **使用 Raster Calculator** - 打开 `Raster Calculator`(Processing Toolbox 中搜索)。 - 输入条件表达式,例如将高程分为三类: ``` (dem@1 <= 500) * 1 + (dem@1 > 500 AND dem@1 <= 1000) * 2 + (dem@1 > 1000) * 3 ``` - 指定输出格式为 GeoTIFF。 2. **通过插件重分类(如 Reclassify by Table)** - 安装 `Reclassify by Table` 插件。 - 定义旧值范围与新值的映射表,例如: | 旧值范围 | 新值 | |----------|------| | 0-500 | 1 | | 500-1000 | 2 | | >1000 | 3 | 3. **GRASS GIS 工具** 在 Processing Toolbox 中搜索 `r.reclass`,上传规则文件(如 `rules.txt`)定义分类规则。 --- #### **常见问题与注意事项** - **数据范围不匹配**:检查 DEM 的元数据,确认高程值范围是否覆盖分类区间。 - **Nodata 处理**:在 QGIS 中可通过 `Raster Calculator` 添加条件 `ELSE 0` 或保留原值。 - **分类方法选择**: - 等间隔:适用于均匀分布的高程数据。 - 自然间断点:适合突出地形突变区域[^2]。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值