goto,void,extern,sizeof分析

goto:

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

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

void:

修饰函数返回值和参数

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

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

void*:

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

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

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

void* pc1=pc2=NULL;

pc1=pi;

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

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

 1 //*******test4.c********
 2 void* my_memset(void* p,char v,int size) 
 3 {
 4   void* ret=p;
 5   int i=0;
 6   char* dest=(char*)p;
 7   for(i=0;i<size;i++)
 8   {
 9     dest[i]=v;
10   }
11   return ret;
12 }
13 
14 int main()
15 {
16   int abc[5]={1,2,3,4,5};
17   my_memset(abc,0,sizeof(abc));
18   for(int i=0;i<5;i++)
19   printf("%d
",abc[i]);
20   return 0;
21 }

函数中参数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 ",sizeof(a)); //4

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

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

内在的趣味,表面的繁琐
原文地址:https://www.cnblogs.com/data1213/p/4819968.html