我将我的函数void Assign_numbers
传递给了void Adding
。当我将其更改为指针并对其进行编译时,第一个数组值将从number.a
中的void Assign_numbers
返回相同的值。从ptr[1]
开始的数组中的另一个值给出了完全不同的数字。你可以请帮助我,这样阵列就可以输出其他指定的号码了。请不要更改格式。
#include <stdlib.h>
#include <stdio.h>
#define Max 6
struct Numbers
{
double a,b,c,d,e,f;
};
void Adding(struct Numbers *ptr)
void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding(&number);
}
void Adding(struct Numbers *ptr)
{
int i =0;
for(i;i<Max;i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
int main()
{
Assign_numbers();
return 0;
}
答案 0 :(得分:3)
在Adding
函数中,变量ptr
指向单个结构,基本上是单个元素的结构。当你这样做时ptr[1]
您尝试访问此单元素数组中的第二个元素,该元素超出范围并将导致未定义的行为。
你根本无法像标准数组一样处理标准C中的结构。
但是有 hacks 。例如,使用结构作为一个成员和一个数组作为另一个成员的联合,但这依赖于编译器不在结构的成员之间添加任何填充。它既不便携也不推荐。
答案 1 :(得分:3)
指针的类型(在您的情况下为struct Numbers
)定义数组中元素的偏移量。例如,如果您拥有某种类型T
的数组,则使用a[i]
意味着从地址T
获取a + i * sizeof(T)
的值或更简单。< / p>
注意:要成为真a[i]
,我们会将*(a + i)
转换为i[a]
,这就是struct Numbers *ptr
正常工作的原因。请参阅With arrays, why is it the case that a[5] == 5[a]?问题。
现在您拥有ptr[0]
并使用*(ptr + 0 * sizeof(struct Numbers))
使其成为ptr[1]
,从而引导您进入内存中的结构。但是使用*(ptr + 1 * sizeof(struct Numbers))
会导致double*
,但是内存中没有关于此地址的数据,这会导致未定义的行为。
您要做的是使用void Assign_numbers()
{
struct Numbers number;
number.a=45.78;
number.b=81.45;
number.c=56.69;
number.d=34.58;
number.e=23.57;
number.f=78.35;
Adding((double*)&number);
}
void Adding(double* ptr)
{
int i = 0;
for(i; i < Max; i++)
{
ptr[i];
printf("%.2f\n",ptr[i]);
}
}
遍历您的结构,例如
45.78
81.45
56.69
34.58
23.57
78.35
打印
union
另一种方法是使用<body>
。例如,请参阅C method for iterating through a struct's members like an array?。