C语言深度剖析--读书笔记_void 关键字
2013-03-15 12:32
183 查看
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规则来处理的。
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规则来处理的。
相关文章推荐
- C语言深度剖析--读书笔记7_const关键字
- C语言深度剖析--读书笔记6_return关键字
- struct关键字---C语言深度剖析读书笔记9
- C语言深度剖析--读书笔记2_static关键字
- 读书笔记:c语言深度剖析之关键字
- C语言深度剖析--读书笔记4_signed/unsigned关键字
- C语言深度剖析--读书笔记3_sizeof
- 9.读c语言深度剖析 -- void
- c语言深度剖析之—关键字
- C深度剖析读书笔记-第一章关键字
- 读c语言深度剖析 -- void
- C语言深度剖析读书笔记
- 读书笔记之:C语言深度剖析
- 读c语言深度剖析 -- 第一章 关键字(32个)
- Mohican_11/18 C语言深度剖析 - 关键字
- 读书笔记之:C语言深度剖析
- 【C语言深度剖析】读书笔记之 signed ,unsigned
- c语言深度剖析 -- 读书笔记
- C语言深度剖析读书笔记
- 《c语言深度剖析》整理--关键字