void类型的主要作用:限定函数返回类型,限定函数参数类型
1.指针赋值:
(1)两种不同类型的指针,不能直接相互赋值(涉及void类型的除外)
例1:
long *p1;
int * p2;
p1=p2;
警告:从不兼容的指针类型赋值
(2)void类型的指针,可以接受任意类型的指针。但是,不能直接把void指针直接赋值给其他
例2:
void *p1;
int *p2;
p1=p2; // ok ,没有任何问题
p2=p1; //不可以,不能把void类型的指针,直接赋值给 其他类型的指针。
2.void限定函数的返回值类型,和参数类型:
(1)不指定返回值,并不等于,返回值为void。编译器把未制定返回类型,作为返回整型处理。
例3:
func1() //func1函数,并没有制定返回类型
{
return 10;
}
int main()
{
printf("func1 returns a value:%d\n",func1()); //把func1()的返回值,作为int处理了
return 0;
}
打印结果:func1 returns a value:10
(2)函数参数列表为空,不代表该函数不能接受参数(在C中可以)。只有在函数参数列表中,指明void,该函数才被认为不可接受参数。
例4:
func1()
{
return 10;
}
int main()
{
printf("func1 returns a value:%d\n",func1(2)); //注意,这里向func1中传了一个参数..
return 0;
}
打印结果:func1 returns a value:10
函数编译通过,正常执行。这样容易引起误解,函数在定义的时候无参,为何还可以传参。所以在定义函数的时候,如果函数无参,那么要指明参数为void
例5:
func1(void)
{
return 10;
}
int main()
{
printf("func1 returns a value:%d\n",func1(2));
return 0;
}
打印结果:提供给func1函数的参数过多!
3.void指针的运算
首先,ANSI与GNU关于void指针操作,有不同规定。
(1)在ANSI标准中,进行算法操作的指针,必须是确定其所指数据类型大小的。(这里的指针算法操作指:p++,p+=1...)
例6:
void *pvoid;
pvoid++; //报错
在ANSI中,因为不知道pvoid指向何种类型,自然也不知道其所指的对象有多大的内存。这样,pvoid++就没有意义。
(2)在GNU中,它指定void指针的操作,等同与char型指针。
例7:
void *p1;
printf("before ++,p1 is 0x%x\n",p1);
p1++;
printf("after ++,p1 is 0x%x\n",p1);
打印结果:
before ++,p1 is 0xaa0ff4
after ++,p1 is 0xaa0ff5
由上可见,p1++后,地址比之前增加了1。所以,在GNU中,void指针的运算,是按照char规则来处理的。