static和const和define关键字比较

一般内存主要分为: 代码区、 常量区、 静态区(全局区)、 堆区、 栈区 这几个区域
大小端测试:数据在内存中存放,有大端模式和小端模式
小端模式(little-endian):低位字节存放在低地址上,高位字节存放在高地址上
大端模式(big-endian):低位字节存放在高地址上,高位字节存放在低地址上。
网络字节序:TCP/IP各层协议将字节序定义为Big-Endian, 因此TCP/IP协议中使用的字节序通常称之为网络字节序
static uint32_t m=0x87654321;
char *p=(char*)&m;
void test(void)
{   
    printf("P  :0x%p: %x\n",p,*p);
    printf("P+1:0x%p: %x\n",p+1,*(p+1));
    printf("P+2:0x%p: %x\n",p+2,*(p+2));
    printf("P+3:0x%p: %x\n",p+3,*(p+3));
}
如果结果为 *P        : 21
           *(p+1)    " 43        
           *(p+2)    " 65
           *(p+3)    " 87
则为小端模式相符合!

Static关键字:
1 static 修饰局部变量
  修饰局部变量时 修改其存储位置 存储到静态区。作用域未修改。  生存周期修改为程序结束才销毁 
2 static 修饰全局变量
  修饰全局变量时 未改变存储位置。 作用域修改, 仅当前文件可见。 生存周期未修改
3 static 修饰成员变量
  修饰成员变量时 静态成员属于类不属于类对象 需要在类外初始化
4 static 修饰成员函数
  修饰成员函数时 静态函数属于类不属于类对象 需要通过类作用域调用 函数无this指针(静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态
的成员函数)

const关键字:
1 const修饰定义一个变量为常量 (cosnt int a = 10;)
2 const修饰指针 const T* p 指p指向的变量内存不能改变  T* const p 指变量p不能改变
3 const修饰类成员函数 可以使用类中成员变量但是不能改变成员变量的值也称为常成员函数 (void func() const;)
4 const修饰成员变量 只能通过初始化列表初始化 
5 const修饰函数返回值  const 修饰自定义类型的作为返回值, 此时返回的值不能作为左值使用, 既不能被赋值,也不能被修改.

define优点:
(1)方便程序的修改:使用简单宏定义可以代替一个在程序中经常使用的常量,这样在常量改变时不需要对程序进行其他修改
(2)提高程序的运行效率:使用带参数的宏定义可以完成函数调用的功能,能减少系统开销,提高运行效率。因为其在编译时直接展开减少函数调用的开销

const和define的区别
1 define是预编译指令,const是普通变量的定义,define定义的宏是在预处理阶段展开的,而const定义的只读变量在编译运行阶段使用
2 const定义的是变量,宏定义的是常量。    define定义的宏在编译后就不存在了,其不占用内存,因为它不是变量,系统只会为变量分配内存。const定义的常变量任然是一个变量,具有变量的基本属性,有类型、占用存储单元。
3 const定义的是变量,所以其有数据类型编译器编译时能进行参数检查。而宏只是预处理是简单的展开,没有安全检查,容易出现括号问题

mutable关键字:
mutable为可变的,易变的跟C++中的vonst是反义词。被mutable修饰的变量(mutable智能用于修饰类的非静态数据成员),将永远处于可变的状态, 即使在一个const函数中


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值