C++ void*指针、多重指针void**和指针大小

一、定义:       

        用void*  定义一个void类型的指针,它不指向任何类型的数据,意思是,void*指针“指向空类型”或“不指向确定的类型”,而不要理解为void*指针能指向“任何的类型”数据。简而言之:void*只提供一个地址,没有指向

二、作用:

        void*指针不指向任何数据类型,它属于一种未确定类型的过渡型数据,因此如果要访问实际存在的数据,必须将void*指针强转成为指定一个确定的数据类型的数据,如int*、string*等。void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void*指针或从函数返回void*指针;给另一个void*指针赋值。不允许使用void*指针操作它所指向的对象,例如,不允许对void*指针进行解引用。不允许对void*指针进行算术操作。

#include <iostream>
using namespace std;

void* pv;
char* pc;
int* pi;
int i = 10;
char c = 'c';

void main()
{
	pi = &i;
	cout << i <<endl;
	cout << *pi <<endl;
	cout << &i <<endl;
	cout << pi <<endl;
    cout << "====================" <<endl;
	pc = &c;
	cout << c <<endl;
	cout << *pc <<endl;
	cout << &c <<endl;
	cout << pc<<endl;
	cout << "====================" <<endl;
	//pv = &i;
	pv = pi;  //把非void型的指针赋给void型指针变量,pv得到i的地址但,pv不指向i。
	cout << i <<endl;
	//cout << *pv <<endl;  //非法,pv不能指向确定类型的变量
	cout << &i <<endl;
	cout << pv <<endl;
	
	system("pause");
}


        可以把非void*指针赋给void*指针,但不能把void*指针直接赋给非void指针,必须先强转。

	pv = pc;        //合法
	pc = pv;        //非法,void*指针不能直接赋值给非void指针
	pc = (char*)pv; //合法,把void*指针强转成char*型后在赋值

三、多重指针:

        **相当于指向指针的指针,本质还是一个指针,只是它指向的是一个地址。*&很简单,即同级运算,从右到左,先进行地址&运算再进行指针*运算。

	cout << "====================" <<endl;
	int ib = * &i;  //同级运算,从右到左,先地址运算后指针运算
	cout << ib <<endl;
	
    cout << "====================" <<endl;
	int i1 = 1;
	//int* pi1 = &i1;
	//int** ppi1 = &pi1;
	void* pv1 = &i1;
	void** ppv1 = &pv1;
	int** ppout;
	cout << i1 <<endl;
	cout << &i1 <<endl;
	cout << ppv1 <<endl;
//	cout << *ppv1 << endl;  //非法,void*型指针不能直接解引用
//	cout << **ppv1 << endl; //非法,void*型指针不能直接解引用
	pv1 = (int*)pv1;
//	ppv1 = (int**)ppv1;     //非法,cannot convert from 'int ** ' to 'void ** '
	ppout = (int**)ppv1;
	cout << *ppv1 << endl;
	cout << **ppout << endl;


四、C++指针大小:

        在C++中,所有类型的指针大小都相等,比如在32位系统中,无论是int*、char*、string*还是CFile*或者Animal*,其所在内存都是4。

cout << "====================" <<endl;
	cout << sizeof(pi) << endl;
	cout << sizeof(pc) << endl;
	cout << sizeof(pv) << endl;
	cout << sizeof(ppout) << endl;




  • 16
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值