#define 和 const 定义常量的区别

一、数组定义

1.1 全局作用域中定义数组

在全局作用域中定义数组大小,只能使用预处理器宏#define

const变量在代码中表现得像常量,但它们实际上并不是编译时常量。在全局作用域中,不能使用const变量来定义数组大小。编译器要求在编译时就知道数组的大小,而const变量在编译时可能没有固定的值。

#include <stdio.h>

#define NUM_ADJACENT_FRAMES 5
int ADJACENT_FRAMES[2 * NUM_ADJACENT_FRAMES + 1];

int main() {
     // 示例初始化
    for (int i = 0; i < 2 * NUM_ADJACENT_FRAMES + 1; i++) {
        ADJACENT_FRAMES[i] = i; // 示例初始化
    }
    
    // 打印数组内容
    for (int i = 0; i < 2 * NUM_ADJACENT_FRAMES + 1; i++) {
        printf("%d ", ADJACENT_FRAMES[i]);
    }
    printf("\n");
    return 0;
}

1.2 局部作用域定义数组

在局部作用域中定义数组大小,可以使用预处理器宏#define 或者 const

#include <stdio.h>

// #define NUM_ADJACENT_FRAMES 5   
const int NUM_ADJACENT_FRAMES = 5;

void process_frames() {
    int ADJACENT_FRAMES[2 * NUM_ADJACENT_FRAMES + 1];
    
    // 示例初始化
    for (int i = 0; i < 2 * NUM_ADJACENT_FRAMES + 1; i++) {
        ADJACENT_FRAMES[i] = i;
    }

    // 打印数组内容
    for (int i = 0; i < 2 * NUM_ADJACENT_FRAMES + 1; i++) {
        printf("%d ", ADJACENT_FRAMES[i]);
    }
    printf("\n");
}

int main() {
    process_frames();
    return 0;
}

二、细节补充

2.1 #defineconst 的区别

特性#defineconst
类型无类型,仅文本替换有类型,进行类型检查
作用域从定义点到文件结束,或使用 #undef根据定义位置,全局或局部
生命周期编译时定义,在整个编译过程中有效程序运行时有效,根据定义位置决定
初始化不进行初始化,只做文本替换需要显式初始化
内存分配无内存分配,仅文本替换有内存分配,根据定义位置决定(栈或全局)
编译时常量是,可以用于定义全局数组大小不是,在全局作用域不能用于定义数组大小
优点简单、直接、灵活类型安全,易于调试和优化
缺点没有类型检查,容易引起难以发现的错误不能在全局作用域定义数组大小
示例定义#define SIZE 10const int SIZE = 10;
全局数组定义int array[SIZE];无法在全局作用域定义数组大小
局部数组定义int array[SIZE];int array[SIZE];
适用场景简单常量定义,宏函数,编译时常量使用类型检查,需要类型信息的常量,局部数组定义

2.2 全局数组和局部数组的区别

(1)局部数组的内存分配

  • 局部变量(包括局部数组)在函数调用时分配内存。它们通常分配在栈上。
  • 由于栈内存是在运行时管理的,因此局部数组的大小可以基于运行时的值(如函数参数或局部计算结果)。

(2)全局数组的内存分配

  • 全局变量在程序启动时分配内存,它们分配在数据段(.data 或 .bss 段)。
  • 由于数据段的大小必须在编译时确定,因此全局数组的大小必须是编译时常量。

2.3 编译时常量 vs 运行时常量

编译时常量:值在编译时已知,并且编译器可以在编译过程中使用这些值进行优化和内存分配。

运行时常量:值在运行时确定,并且在程序运行过程中使用这些值进行内存分配和操作。

2.4 为什么局部作用域不要求编译时常量

在C语言中,局部作用域定义的数组不要求编译时常量,这主要是因为局部变量在函数调用时分配内存,而不是在编译时分配。这允许更灵活的内存管理和运行时行为。

总结

#define 宏定义:用于编译时常量替换,可以在全局范围内定义数组大小。

const 变量:在编译时不能作为编译时常量,不能在全局范围内定义数组大小,只能在局部作用域(如函数内部)使用。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值