goto、void、const、volatile、struct、union、enum、sizeof的一些使用注意事项

goto

goto绝对禁止使用

void

如果函数没有返回值,应该将其声明为void,如果函数没有参数,应该将其声明为void,void不能定义变量和数组,但能够定义指针。

void指针的意义:void指针作为左值时用于“接受”任意类型的指针,void*指针作为右值使用时需要强制类型转换。

void*指针接受一个其他类型的指针后自身的类型不会转变。

const

const定义一个只读变量。

const不能出现在赋值符号的左边,但可以在定义的时候初始化。

const只在编译期有用,在运行期无用(我们可以在运行期修改const的值,比如说利用指针指向一个const修饰的变量,然后给指针赋值)。

在标准C语言编译期中,const修饰的局部变量在栈上分配空间,const修饰的全局变量在全局数据区分配空间,均只是加上只读属性,值不可改变。

在现代C语言编译器中, const修饰的全局变量被存放在只读存储器中,修改const修饰的全局变量将导致程序崩溃。const修饰的static变量被存放在只读存储区,值被改变将导致程序崩溃。const修饰的普通局部变量在栈上分配空间,值可被改变。

const修饰函数参数表示在函数体内不希望改变参数的值,存放在只读存储区。

const修饰函数返回值表示返回值不可改变,多用于返回指针的类型,存放在只读存储区。

volatile

volatile关键字告诉编译器每次去内存中取变量值。

主要用于可能被多个线程访问的变量,可能被未知因素改变的变量。

struct

对于空结构体,一些编译器认为占用0个内存,一些编译器认为空结构体不应该存在。

柔性数组即数组大小待定的数组,C语言中可以由结构体产生柔性数组。

例如:

struct SoftArray
{
	int len;
	int array[];
};
//此时,softarray中的array[]仅是一个待使用的标识符,不占内存空间。

使用方法:

struct SoftArray* sa = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * 5);
sa->len = 5;

union

union只分配最大成员的空间,所有成员共享这个空间。

union会受到系统大小端的影响。小端模式低字节存储低位数据,大端模式低字节存储高位数据。

例如:

union C
{
      int i;
      char c;
};

union C c;

c.i = 1;

printf(“c.c = %d\n”, c.c);

在小端模式下,int i的0x01存储在低位,c.c取低地址,程序输出结果为1;

在大段模式下,int i的0x01存储在高位,c.c取低地址,程序输出结果为0。

enum

enum是C语言中的一种根据需要自定义的整型值。

默认情况下,第一个定义的enum值默认为0,下一个的enum值是在前一个定义值的基础上加一。

enum定义的值是C语言中真正的常量。

sizeof

sizeof是编译器的内置指示符,并不是函数。

sizeof用于计算类型和变量所占内存的大小。

sizeof的值在编译期就已经确定,然后被具体的数值替换,程序的执行与sizeof没有任何关系。

sizeof用于变量有两种用法:sizeof(var)或sizeof var;sizeof用于类型:sizeof(type)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值