返回目录:https://blog.csdn.net/chen1083376511/article/details/82723709
问题:
问:函数中的void和指针中的void*有什么区别?
答:在函数中的void是表示无类型或无返回类型。void指针是通用指针,用来存放任何数据类型的引用。
分析:
void真正发挥的作用在于:
1.对函数返回的限定。
2.对函数参数的限定。
<函数
返回值> <函数名>(参数1,参数2,参数3,.......){内容;}
------------
int sum(int a,int b)
{
int c;
return c;}
其中第一个int是返回值 就是别的函数调用此函数时这个函数给他的一个值。
1.如果调用时不需要返回值,则函数写为void sum(int a,int b){....},此时函数没有返回值。
如果不需要参数,则int sum(void){...}《或者int sum(){...}》,此时void的意义为空,就是没有参数的意思。
3.如果都不要,则为void sum(void);《或者void sum();》
4.main()
{
return 0;//需要返回值,而且为int型。是因为该函数隐含是返回的是整型类型的。但是在c++上安全检查严格不允许没有int,但是在vc6.0当中,编译器是会通过的。
}
void的作用:
1.对函数返回的限定,当函数不需要返回值时,用void限定,如void fun();
2.对函数的参数的限定,当函数不需要接受参数时,用void限定,如int fun(void)
void指针的作用:
1.函数返回值是任意类型的指针,如void *fun();
2.定义函数指针pfun,如void(*pfun)(),如果该函数指针指向这类函数(即void函数),例如:
void fun()//这类函数
{
}
void main()
{
void(*pfun)();
pfun = fun; //指向某个函数
pfun();//调用方法1
(*pfun)(); //调用方法2
}
3.void指针不能复引用,也就是不能取得它指向的地址的内容。
void *pvoid;
int *pint;
printf("%d",*pint);//正确
printf("%d", *pvoid);//错误
由于pint是整型变量指针,解引用取得该指向地址的内容是整型的,知道从第一字节到第四个字节的内存,而且从低到高保存整数的32补码。
而pvoid是指向还不知道数据类型的地址的通用指针,复引用取得的内容不清楚是什么数据类型,内容占用的内存多大都不清楚。
扩展知识:double数据类型复引用是从第一字节到第八字节的一块内存,从低到高保存double数的浮点数符号位、阶符、阶码和尾数。
-------------------------------------------------------------------------------------------------------------------------------------
问题:
问:下面代码中哪个地方是错误的?
#include
using namespace std;
void main()
{
void *pvoid=NULL;
int *pint;
int m = 2;
pint = &m;
cout << pint << endl;
cout << pvoid << endl;
pvoid = pint;
pint = pvoid;
cout << pint << endl;
cout << pvoid << endl;
}
答:
#include
using namespace std;
void main()
{
void *pvoid=NULL;
int *pint;
int m = 2;
pint = &m;
cout << pint << endl;
cout << pvoid << endl;
pvoid = pint;
pint = (int *)pvoid;//pint=pvoid错误,赋值给pint,pvoid需要强制转换成int类型的。
cout << pint << endl;
cout << pvoid << endl;
}
-------------------------------------------------------------------------------------------------------------------------------------
问题:
问:关于通用指针与解引用的解决问题,以下代码哪些语句是错误的?
void main()
{
int i=100;
void *p=&i;
*p=0;
//----
int a=100;
void *p2=&a;
*(int*)p2=0;
cout< }
答:由于通用指针可以存放任意数据类型的地址,而编译器无法确定该指针指向内存地址中的原始数据类型,因此通用指针无法解引用。
void main()
{
int i=100;
void *p=&i;
*p=0;//错误,通用指针不能解引用
//----
int a=100;
void *p2=&a;
*(int*)p2=0;//正确,由于通过强制转换来指定数据类型,就可以实现解引用
cout< }