您的位置:首页 > 编程语言 > C语言/C++

C语言中关键字的深入理解

2018-03-15 12:07 239 查看
一.void    用法:用于对函数返回值和函数参数的限定,C标准中没有void的标尺,无法裁剪出void大小的内存。

使用时应注意:(1)void不能代表一个真实地变量 如void  a;语句是错误的;

(2)void*指针作为左值用于接收任意类型的指针,作为右值赋给其他指针时需要强制类型转换。举例说明:如void *p1; int *p2; p1=p2是正确的,而p2=p1则是不合法的;

(3)如果函数的参数可以是任意类型的指针,那么应该声明其参数为void*

二.extern    用法:(1)置于变量或函数前,用来标示变量或函数的定义在别(外部)的文件中。其修饰的变量或函数是声明。(2)告诉编译器用C方式编译。在c编译器中使用会报错。

三.sizeof  用法:返回一个变量或者类型的大小(以字节为单位)。

使用时应注意:sizeof是编译器内置关键字,不是函数,sizeof的值在编译期就已经确定。

在计算变量的所占空间大小时sizeof后面括号可以省略,如int a;sizeof(a);与int a;sizeof a ;是等价的,而sizeof(int)与sizeof int ;sizeof  int  这种用法是错误的。

四.const   用法:修饰的变量具有只读属性;其本质仍然是变量,不是真的常量;只对编译器有用,在运行时无用。

const修饰的数组空间不可被改变。const修饰指针时,当const出现在*号左边时指针指向的数据为常量,当const出现在*后右边时指针本身为常量。const修饰函数参数表示在函数体内不希望改变参数的值,修饰函数返回值表示返回值不可改变,多用于返回指针的情形。

五.volatile   用法:可理解为编译器警告指示字。告诉编译器必须每次从内存中去变量值而不做优化。

主要修饰可能被多线程访问的变量,也可修饰可能被未知因素更改的变量。

注:只读状态寄存器既是const的也是volatile的。

六.struct  用法:用于定义结构体类型的变量。此处给出用其定义柔性数组实现斐波那契数列的例子#include<stdio.h>
#include<malloc.h>

typedef struct _soft_array
{
int len;
int array[];
}SoftArray;

SoftArray* creat_soft_array(int size)
{
SoftArray* ret = NULL;

if(size > 0)
{
ret = (SoftArray*)malloc(sizeof(*ret)+sizeof(*(ret->array))*size);
ret -> len = size;
}
return ret;
}

void fac(SoftArray* sa)
{
int i;

if(NULL != sa)
{
if( 1 == sa -> len)
{
sa->array[0] = 1;
sa->array[1] = 1;
}

else
{
sa->array[0] = 1;
sa->array[1] = 1;
for(i = 2; i < sa->len; i++)
{
sa->array[i] = sa->array[i-1] + sa->array[i-2] ;
}
}
}
}
void delete_soft_array(SoftArray* sa)
{
free(sa);
}
int main()
{
int i = 0;
SoftArray* sa = creat_soft_array(10);

fac(sa);

for(i = 0; i < sa-> len; i++)
{
printf("%d\n", sa->array[i]);
}
delete_soft_array(sa);

return 0;
}注意,定义柔性数组时,结构中的最后一个元素允许是未知大小的数组,其前必须至少有一个其他成员。sizeof返回的这种结构大小不包括柔性数组的内存大小。
七. union   定义联合体结构变量。 一个union只配置一个足够大的空间以来容纳最大长度的数据成员,所有成员起始地址一致,受系统大小端的影响,可以用来测试系统的大小端。代码如下#include<stdio.h>
#include<malloc.h>

int checksys()
{
union check
{
int i;
char c;
}cc;

cc.i = 1;

return cc.c;
}

int main()
{
printf("%d\n", checksys());

return 0;
}如果打印出的值为1,则系统是小段模式,如果为0,则为大端。
八. enum  用来定义枚举类型变量,其定义的常量是真正的常量,定义常量时通常用其定义。

九.typedef    给一个已存在的数据类型取一个别名,而非定义一个新的数据类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: