面试题-指针-void*通用指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen1083376511/article/details/82712336

返回目录: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<iostream>
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<iostream>
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<<a<<endl;
}

答:由于通用指针可以存放任意数据类型的地址,而编译器无法确定该指针指向内存地址中的原始数据类型,因此通用指针无法解引用。

void main()
{
int i=100;
void *p=&i;
*p=0;//错误,通用指针不能解引用
//----
int a=100;
void *p2=&a;
*(int*)p2=0;//正确,由于通过强制转换来指定数据类型,就可以实现解引用
cout<<a<<endl;
}

猜你喜欢

转载自blog.csdn.net/chen1083376511/article/details/82712336
今日推荐