goto,void,extern,sizeof分析

时间:2022-12-19 16:54:36

goto:

程序的质量与goto出现的次数成反比,禁用

goto的副作用:破环了程序的结构化的顺序执行的过程,它有可能会跳过程序的应该执行的一些步骤。

void:

修饰函数返回值和参数

c语言中没有定义void的内存空间的大小,无法在内存中裁剪出void对应的变量,但是不同的编译器,可能为该数据类型定义了内存空间大小,并且标准还不一致。

printf("%d\n",sizeof(void));执行的结果在不同的编译器中,结果可能不同。

void*:

作为左值,用于接收任意类型的指针

作为右值,赋值给其他类型的指针时,需要强制类型转换

int* pi=(int*)malloc(sizeof(int));

void* pc1=pc2=NULL;

pc1=pi;

pi=(int*)pc1; //正确写法

pi=pc2; //可能一些编译器也能通过,但是就语法结构而言,说明该编译器不够规范。

 //*******test4.c********
void* my_memset(void* p,char v,int size)
{
void* ret=p;
int i=;
char* dest=(char*)p;
for(i=;i<size;i++)
{
dest[i]=v;
}
return ret;
} int main()
{
int abc[]={,,,,};
my_memset(abc,,sizeof(abc));
for(int i=;i<;i++)
printf("%d\n",abc[i]);
return ;
}

函数中参数void* p 表示可以接受所有类型变量的指针,这就是void*的好处。

extern用来声明外部定义的变量或函数,外部体现在另一个文件中定义,在文件中声明之后,就可以调用这个函数或是使用这个变量:

extern int abc;

extern int func(int a,int b);

第二个作用:用来告诉c编译器用C方式编译。

extern "c"

{

int add(int a,int b)

{

return a+b;

}

}

sizeof是编译器的内置指示符,不是函数;用于“计算”相应的实体所占用的内存大小;sizeof的值在编译期就已经确定:

int  abc;

sizeof(a),sizeof(int)

printf("%d\n",sizeof(a)); //4

printf("%d\n",sizeof a); //4

printf("%d\n",sizeof(int)); //4