C++指针之间的赋值与转换规则总结
来源:互联网 发布:农村淘宝佣金 编辑:程序博客网 时间:2024/05/26 20:24
Note:以下结论不适用于类的成员函数指针,关于类的成员函数指针会单独讨论。
一、任何类型的指针变量均可直接赋值给const void *
任何类型的非const指针变量均可直接赋值给void *
const指针变量不可直接赋值给void *,除非通过强制类型转换
class A{}; typedef int (*pFun)(string); //函数指针 int *pInt;const int *pInt_c;char *pChar;const char *pChar_c;double *pDouble;const double *pDouble_c;A *pA; //自定义类型指针const A *pA_c;pFun pf; //函数指针 void* pVoid;const void* pVoid_c; // 1.任何类型的指针变量均可直接赋值给constvoid *pVoid_c = pInt; //okpVoid_c = pInt_c; //okpVoid_c = pChar; //okpVoid_c = pChar_c; //okpVoid_c = pDouble; //okpVoid_c = pDouble_c; //okpVoid_c = pA; //okpVoid_c = pA_c; //okpVoid_c = pf; //ok // 2.任何类型的非const指针变量均可直接赋值给void*pVoid = pInt; //okpVoid = pChar; //okpVoid = pDouble; //okpVoid = pA; //okpVoid = pf; //ok // 3.const指针变量不可直接赋值给void *,除非通过强制类型转换pVoid = pInt_c; //error: cannot convert from 'constint *' to 'void *'pVoid = pChar_c; //error: cannot convert from 'constchar *' to 'void *'pVoid = pDouble_c; //error: cannot convert from 'constdouble *' to 'void *'pVoid = pA_c; //error: cannot convert from'const A *' to 'void *'pVoid = (void*)pInt_c; //okpVoid = (void*)pChar_c; //okpVoid = (void*)pDouble_c; //okpVoid = (void*)pA_c; //ok
二、任意类型指针变量之间均可以强制类型转换,包括const与非const指针变量之间的强制类型转换。
pInt = (int*)pDouble; //okpInt = (int*)pf; //okpInt = (int*)pInt_c; //ok:由const指针变量转非const指针变量pInt = (int*)pA_c; //ok:由const指针变量转非const指针变量pA = (A*)pA_c; //ok:由const指针变量转非const指针变量pA = (A*)pDouble; //okpA = (A*)pf; //ok pf = (pFun)pDouble; //okpf = (pFun)pA; //ok
三、有继承关系的自定义类型之间:子类型指针变量可直接赋值给父类型指针变量
父类型指针变量不可直接赋值给子类型指针变量,除非通过强制类型转换
class A{}; class B : public A // B继承自A{}; class C{}; A* pA;B* pB;C* pC; pA = pB; //ok: 子类型指针变量可直接赋值给父类型指针变量pB = pA; //error: 父类型指针变量不可直接赋值给子类型指针变量,除非强制类型转换 //以下适用规则二:pA = (A*)pC; //okpB = (B*)pA; //okpB = (B*)pC; //okpC = (C*)pA; //okpC = (C*)pB; //ok
补充:
1、对于类的成员函数指针,以上原则不适用。
class A{}; typedef void (A::*AFunPointer)(void);typedef void (*FunPtr)(void); void * pVoid;int * pInt;FunPtr fp;AFunPointer afp; pVoid = afp; //error: cannot convert from'AFunPointer' to 'void *'pInt = (int*)afp; //error: 'type cast' : cannot convert from'AFunPointer' to 'int *'fp = (FunPtr)afp; //error: 'type cast' : cannot convert from'AFunPointer' to 'FunPtr' afp = (AFunPointer)pInt; //error: 'type cast' : cannot convert from'int *' to 'AFunPointer'afp = (AFunPointer)pVoid; //error: 'type cast' : cannot convert from'void *' to 'AFunPointer'afp = (AFunPointer)fp; //error: 'type cast' : cannot convertfrom 'FunPtr' to 'AFunPointer'
我们可以这样理解:类的成员函数指针被限定在具体的某个类的作用域中了,他不能和域外的指针之间转换。
2、除去类的成员函数指针,虽然任意类型指针变量之间均可以强制类型转换,也即可以将const指针强转为非const指针。
但是应注意:如果将const指针强转为非const指针而用于原本const的对象,则产生未定义行为(C++语言未对此种情况进行规定)。如:
const int a = 50; // 定义const变量及常量const int* p = &a; // const指针变量p指向const变量aint* q = (int*)p; // const指针强转为非const指针,则非const指针变量q指向const变量a*q = 56; // 行为未定义,以下输出为VS2008下的输出结果cout << a << endl; //输出: 50cout << *p << endl; //输出: 56,很显然,p已经不指向a了cout << *q << endl; //输出: 56,很显然,q已经不指向a了
3、关于一般函数指针的强制转换,以下当然也是OK的。
class A;typedef void (*pFun1)(int, int);typedef int (*pFun2)(A*, double); pFun1 pf1;pFun2 pf2;pf2 = (pFun2)pf1; // OK
0 0
- C++指针之间的赋值与转换规则总结
- C++指针之间的赋值与转换规则总结
- C++指针之间的赋值与转换规则总结
- C语言指针之间赋值的合法性
- c语言算术运算表达式与赋值运算表达式的类型转换规则
- const与指针之间的赋值
- C-指针赋值总结
- java十进制数与各进制之间的转换规则与算法
- C指针的初始化与赋值
- C/C++ 引用,赋值,指针之间的区别
- char数组和指针与CString之间的赋值问题
- 进制之间的转换规则
- C语言的类型转换规则
- 指针的赋值与引用的赋值
- 【Objective-C指针与CoreFoundation指针之间的转换】
- Objective-C指针与CoreFoundation指针之间的转换
- CString和其他类型之间的转换规则:
- c语言与指针——(二)指针变量的定义与赋值
- netbeans 查找替换整个项目
- 安卓按home键之后,再次点击程序图标避免再次重新启动程序解决办法
- QTableWidget之表头塌陷、光标移动
- SQLite 入门教程(四)增删改查
- 集成 Tomcat 插件到 Eclipse 的过程
- C++指针之间的赋值与转换规则总结
- Qt 打开指定网站/系统文件夹
- MSDN教你美化控件之DataGridView
- 权限设置
- 代理模式及Java动态代理
- linux+ogre环境搭建
- 基于visual Studio2013解决算法导论之021单向循环链表
- POJ1664 DFS做法
- 关于C++的new是否会对内存初始化的问题