gpt4 book ai didi

c - 关于在泛型函数中进行转换的一些误解

转载 作者:太空狗 更新时间:2023-10-29 16:05:29 24 4
gpt4 key购买 nike

我对类里面的教程有一些误解。有一个名为 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 the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and (P)-N (where N has the value n) point to, respectively, the i+n-th and i−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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com