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