我有一个结构“Register”,声明如下:
typedef struct {
int TypeID;
unsigned char InstrumentType[128];
unsigned char RegTag[128];
unsigned char Protocol[128];
int RegNum;
unsigned char RW[128];
unsigned char RegisterType[128];
unsigned char Signed[128];
unsigned char Inverted[128];
unsigned char DataType[128];
int Counts;
} Register;
我有一个名为“Reg [9]”的寄存器数组,并希望创建一个名为“TransferValues”的函数,为数组中每个元素的结构中的所有字段赋值。更新值后,它们将在main()
中单独输出。如何将数组传递给此函数?
答案 0 :(得分:4)
您使用语法Reg
TransferValues(Reg);
传递到该函数中
该功能的格式为
/*return type*/ TransferValues(Register* array)
(在函数体中,您可以使用array[i]
代替*(array + i)
,其中i
是数组的有效索引,可以更具可读性。)
在C中,数组在传递给函数时衰减指针。请注意,您可能还希望将数组中的元素数传递给函数。
答案 1 :(得分:3)
数组自然衰落到指向第一个元素的指针。使用数组时,实际上是在使用指针。
所以解决方案就是让函数接受一个指向结构的指针作为参数。如果事先没有修复和知道,那么为函数提供元素数量也会有所帮助。
重要的是要知道对函数类型使用类似数组的声明,比如
void TransferValues(Register regs[9])
或
void TransferValues(Register regs[])
实际上并未将regs
声明为数组,编译器会将regs
静默转换为指针(Register *regs
)。当尝试使用sizeof
技巧获取数组中的元素数时,这会产生影响。
对于实际数组,例如
Register regs[9]
您可以使用sizeof(regs) / sizeof(regs[0])
来获取数组中的元素数量。这在函数中不起作用,因为你只有一个指针,并且在指针上执行sizeof
将给出实际指针的大小而不是它指向的数据。
答案 2 :(得分:3)
将c数组衰减传递给pointer传递给函数时,您只需调用传递数组的函数即可。
使用指针的小例子:
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <inttypes.h>
typedef struct {
int32_t TypeID;
char InstrumentType[128];
} Register;
void func ( Register *reg, size_t n_regs )
{
for (size_t i=0; i< n_regs; i++)
{
reg[i].TypeID = (int32_t)(i);
sprintf(reg[i].InstrumentType, "Instrument_%zu", i);
}
}
int main (void)
{
Register Reg[9] = {{0}};
func(Reg, sizeof(Reg)/sizeof(Reg[0]));
for (size_t i=0; i<sizeof(Reg)/sizeof(Reg[0]); i++)
{
printf ("Reg[%zu].TypeID = %"PRId32"\n", i, Reg[i].TypeID);
printf ("Reg[%zu].InstrumentType = %s\n", i, Reg[i].InstrumentType);
}
}
正如您所看到的,您还应该传递给函数,您将要写入传递数组的大小,以确保不会超出传递数组的范围。