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;
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 理解*(void**)
- 下一篇: sizeof 计算发生在编译时