大佬教程收集整理的这篇文章主要介绍了关于在通用函数中进行转换的一些误解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
这是代码:
int main() { int a[] = { 2,7,6,4,1 }; double b[] = { 12.5,2.7,3.0,5.5,5.9,1.0 }; print_Arr(a,sizeof(a)/sizeof(a[0]),sizeof(int),print_int); print_Arr(b,sizeof(b)/sizeof(b[0]),sizeof(doublE),print_doublE); } void print_Arr(void* a,int size,int m,void (*print_funC)(void* )) { for (int i = 0; i <= size-1; i++) { print_func((char*)a + m*i); } } void print_int(int* p) { printf("%d\n",*p); } void print_double(double* num) { printf("%f\n",*num); }
为什么我必须在此行中转换为(char *):
print_func((char*)a + m*i);
我发送给print_Arr()泛型函数两种类型的数组整数或双精度数,
因此逻辑上将a转换为int *或double *.
但为什么它会变成char *?我错过了什么?
指针算术利用所指向类型的大小. void是一个永远不完整的类型,无法完成,因此无法在指向void类型的指针上进行指针运算.
要为加法运算符添加引用C11,章节§6.5.6,约束:
并且,从第6.2.5章开始,
那说,为什么演员阵容是char *:
指针算术使用指向的类型.再次引用规范
((char*)a + m*i);
其中m是实际参数指向的实际对象类型的大小.因此,如果将指针强制转换为实际类型,则计算错误.为了进行比较,请说:
> sizeof(char)为1,标准规定.
> sizeof(int)== 4,在你的平台上说.
因此,对于数组int arr [] = {1,2,3,4},表达式
>(char *)a(sizeof(int)* 1)
和
>(int *)a 1
是等价的.
最后,触及将另一种类型的指针转换为char *并访问它的主题:
以上是大佬教程为你收集整理的关于在通用函数中进行转换的一些误解全部内容,希望文章能够帮你解决关于在通用函数中进行转换的一些误解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。