在请问一下,我定义一个
srtuct a
{
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
}aa;
现在我想把一个数组,比如unsigned char b[4]={0,1,2,3};
分别赋给结构体里的a1,a2,a3,a4有没有方便的办法,
aa.a1=b[0];
......
这种我知道,我想要的是用for循环赋值的方法,有吗?
如果结构体内部含有数组呢?
很难找到更适合的方法了,用指针的话要保证结构体成员对齐一致。
把指针指向结构体第一个成员,然后用循环依次赋值。至少具体到你这个上是没有错误的。另外结构体里也能用数组
结构体里也是可以写数组的,只是这样的写法可能会导致本来结构体内很清晰的各元素的意义变成看了不知所云的编号1、2、3、…。
要避免上述问题,或许可采用联合体的写法:数组和结构体都表现了,让应用程序各取所需。
typedef union {
unsigned char array[4];
srtuct {
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
};
} AA_TYPE;
AA_TYPE bb;
我现在用的就是这种方法,a1=array[0]吧?
是不是说我给他们之中的任意一个赋值,另一个值也跟着一起改变了是吧?
突然想起另一个问题我如果定义:
typedef union {
unsigned int a;
srtuct {
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
};
} AA_TYPE;
那岂不是就相当于把一个int直接拆成4个char;
我想取a的高位就直接取a4就可以了,不用(char)a&ff000000;这样了?
我测试了一下,可以,不知道有没有要注意 的地方;
不过INT只有两个字节,我用的是LONG!
不知这样是否可行
unsigned char *p_ch = &(aa.a1);
for (unsigned char i = 0; i < 4; i++) {
*(p_ch+i) = b[i];
}
方法一:
srtuct a
{
unsigned char a1;
unsigned char a2;
unsigned char a3;
unsigned char a4;
} aa = {
.a1 = b[0],
.a2 = b[1],
.a3 = b[2],
.a4 = b[3]
};
方法二:
memcpy(aa, b, sizeof(aa));
方法三:
aa = *(struct a *)b; 本帖最后由 JOKSON 于 2014-4-9 13:03 编辑
系统给结构体和数组都是分配连续的存储空间的,LZ想实现什么样的赋值方式,不妨从这个角度考虑下
在结构体里按数组下标操作是非常不爽的,,,,对齐啥的不说了,本身这件事就很反模式