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 给一个已存在的数据类型取一个别名,而非定义一个新的数据类型。
使用时应注意:(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 给一个已存在的数据类型取一个别名,而非定义一个新的数据类型。
相关文章推荐
- 对C语言中的static关键字的深入理解
- 深入理解C语言指针的奥秘(补充)
- 深入理解C++中的mutable关键字
- Java编程:深入理解final关键字
- 深入理解计算机系统中一个echo()函数的C语言实现
- 深入理解C++中的mutable关键字
- C语言 unsigned 和 signed 类型相互转换深入理解
- 深入理解C语言
- 深入理解C++中的mutable关键字
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘(转贴)
- C语言头文件深入理解
- c语言typedef关键字的理解
- 【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解
- 深入理解C语言
- 深入理解C++中的mutable关键字
- 深入理解C语言中的指针与数组之指针篇(转载)
- 深入理解C语言指针的奥秘(yanglilibaobao )
- 【笔试面试知识点查缺补漏深入理解之C与C++篇】C语言中的指针数组与数组指针
- 深入理解C语言指针的奥秘