C语言复习goto和vide

goto语句是一个比较有意思的东西。因为这个东西没操作好就是一个bug,所以一般能不用它,就不要用它。

goto语句的作用是无条件从goto跳到同一函数内的另一条语句(所以不要再程序中使用goto,他会使程序难以理解和修改);

goto语句的语法:goto lable;lable是由标识符和一个冒号组成比如(end:)。

oid func(int n)
{
    int* p = NULL;


    if(  n < 0 )
    {
        goto STATUS;//假如n<0会无条件跳到STATUS
    }


    
    p = (int*)malloc(sizeof(int) * n);
    
STATUS://绕过了p = (int*)malloc(sizeof(int) * n);
    p[0] = n;    //所以p是NULL指针,无法赋值。所以程序爆炸
    
    free(p);

}

所以goto语句破坏了C语言的结构化;所以还是把他打入冷宫吧;

接下来说一说void

void,我把他看做一个抽象类型,不存在大小,在标准c编译器里不能求void大小,但在一些扩展c中会被定义为1比如gcc。

但我们可以用它来定义函数和参数;在C语言中我们可以不用显示的定义返回值类型,和参数类型。

比如

func()//没有返回类型和参数类型。

{}

int main()

{

    func(1,2,3,4,5,6);

    return 0;

}

C语言会默认为func返回类型为int,参数类型为int且参数可以是任意多个。如果不想有返回值和参数,我们就要显示申明为void的类型。

void func(void)

{

}

另外void不能用来声明变量比如void i;//error     void i[5]={0};//error

但是void可以用来声明指针。比如void* p;当 p为左值时,p可以指向任何类型的指针,当p为右值时,想使用它,就需要强制类型转换。比如  int i; void* p = &i; int *ip = (int*)p;

那么void* 一般用到哪里呢?一般用在函数参数时,当void*为函数参数时,表明这个参数可以接受任意类型的参数指针;

#include <stdio.h>


void MemSet(void* src, int length, unsigned char n)//将一段内存设置为某个值
{
    unsigned char* p = (unsigned char*)src;
    
    int i = 0;
    
    for(i=0; i<length; i++)
    {
        p[i] = n;
    }
}


int main()
{
    int a[5];
    int i = 0;
    
    MemSet(a, sizeof(a), 0);
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", a[i]);
    }
    
    return 0;

}

学习交流群学习交流群199546072

猜你喜欢

转载自blog.csdn.net/qq_39809601/article/details/81006856
今日推荐