gpt4 book ai didi

c - 算术和强制转换指针和结构

转载 作者:行者123 更新时间:2023-11-30 16:35:43 46 4
gpt4 key购买 nike

我有一个定义如下的结构数组。

typedef struct
{
_id customer_id; // unsigned int (4 bytes)
char customer_name [40];
char customer_surname [40];
char customer_vat [40];
char customer_add [60];
char customer_email [60];
char customer_land_phone [22];
char customer_mob_phone [22];
time_t customer_creation_date; // long int (8 bytes)
} _Customer_Struct;

和一个结构数组...

_Customer_Struct customers [x];   // x is irrelevant

以及结构数组成员的偏移数组...

const size_t offset [9] =
{
(&customers[0].customer_id - (_id *) customers) / sizeof (_id), // stores 0
(&customers[0].customer_name[0] - (char *) customers) / sizeof (char), // stores 4
(&customers[0].customer_surname[0] - (char *) customers) / sizeof (char), // 44
(&customers[0].customer_vat[0] - (char *) customers) / sizeof (char), // 84
(&customers[0].customer_add[0] - (char *) customers) / sizeof (char), // 124
(&customers[0].customer_email[0] - (char *) customers) / sizeof (char), // 184
(&customers[0].customer_land_phone[0] - (char *) customers) / sizeof (char), // 244
(&customers[0].customer_mob_phone[0] - (char *) customers) / sizeof (char), // 266
(&customers[0].customer_creation_date - (time_t *) customers) / sizeof (time_t) // 4 what...?
};

每行旁边都有一个注释,其中包含为每个表达式存储的值。现在,看一下最后一行(&customers[0].customer_creation_date - (time_t *) 客户)/sizeof (time_t)。如果我理解,这应该将 customers (数组)的基地址转换为 time_t,等于 long int,从 &customers[0].customer_creation_date 中减去其地址值,得到 n*(time_t) 形式的部分结果>,最后除以 (time_t) 的字节大小,生成相应的字节偏移量。基本上与前八行相同

问题1:为什么这个表达式产生 4 而不是 288?

问题2:如果我将其转换为 char 为什么它会起作用?

(char *)&customers[0].customer_creation_date - (char *)customers)/sizeof (char) 实际上产生 288。

最佳答案

您正在进行指针数学运算来计算偏移量,这是有效的,但请记住,指针数学运算旨在生成一个整数,该整数可用作指针所指向类型的数组的索引。

所以:

(&customers[0].customer_creation_date - (time_t *) customers)

正在计算假设的“j”:

((time_t *)&customers)[j] == &customers.customer_creation_date

当您将指针强制转换为 (char *) 时,指针数学是以字符为单位完成的,这就是您的意思。这同样适用于 customer_id,只不过因为它是第一个,所以它的偏移量无论如何都是零。

关于c - 算术和强制转换指针和结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48779028/

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