- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对类里面的教程有一些误解。有一个名为 print_Arr()
的函数,它是获取指向 double 或整数数组的指针并打印它的通用函数。
代码如下:
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);
}
为什么我必须在这一行中将 a
转换为 (char*)
:
print_func((char*)a + m*i);
我向 print_Arr()
发送了两种类型的整数或 double 组的泛型函数,因此从逻辑上讲,将 a
转换为 int *
或 double*
。
但为什么要转换为 char*
?我想念什么?
最佳答案
首先,谈谈为什么需要类型转换:
指针算法利用所指向类型的大小。 void
是永远不完整的类型,无法完成,因此无法对指向 void
类型的指针进行指针运算。
要添加,对于加法运算符,引用自 C11
,第 6.5.6 章,约束:
For addition, either both operands shall have arithmetic type, or one operand shall be a pointer to a complete object type and the other shall have integer type.
并且,从第 6.2.5 章开始,
The
void
type comprises an empty set of values; it is an incomplete object type that cannot be completed.
也就是说,为什么强制转换为 char*
:
指针算法使用被指向的类型。再次引用规范
[...] if the expression
P
points to thei
-th element of an array object, the expressions(P)+N
(equivalently,N+(P))
and(P)-N
(whereN
has the valuen
) point to, respectively, thei+n
-th andi−n
-th elements of the array object, provided they exist.
在这里,看看你的构造:
((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*
并访问它的话题:
[...] When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object. Successive increments of the result, up to the size of the object, yield pointers to the remaining bytes of the object. [....]
关于c - 关于在泛型函数中进行转换的一些误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50889105/
我是一名优秀的程序员,十分优秀!