4298|14

407

帖子

3

TA的资源

纯净的硅(初级)

楼主
 

问一个C语言结构体赋值的问题 [复制链接]

 
在请问一下,我定义一个
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循环赋值的方法,有吗?
如果结构体内部含有数组呢?
此帖出自编程基础论坛

最新回复

谢谢了,又找到适合我的了  详情 回复 发表于 2014-5-9 08:09
点赞 关注
 

回复
举报

6040

帖子

204

TA的资源

版主

沙发
 
很难找到更适合的方法了,用指针的话要保证结构体成员对齐一致。
此帖出自编程基础论坛
 
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

板凳
 
把指针指向结构体第一个成员,然后用循环依次赋值。至少具体到你这个上是没有错误的。另外结构体里也能用数组
此帖出自编程基础论坛
 
个人签名    懒得很
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

4
 
结构体里也是可以写数组的,只是这样的写法可能会导致本来结构体内很清晰的各元素的意义变成看了不知所云的编号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;
此帖出自编程基础论坛
 
 
 

回复

407

帖子

3

TA的资源

纯净的硅(初级)

5
 
仙猫 发表于 2014-3-10 09:20
结构体里也是可以写数组的,只是这样的写法可能会导致本来结构体内很清晰的各元素的意义变成看了不知所云的 ...

我现在用的就是这种方法,a1=array[0]吧?
是不是说我给他们之中的任意一个赋值,另一个值也跟着一起改变了是吧?
此帖出自编程基础论坛
 
个人签名我在想
我知道什么
 
 

回复

407

帖子

3

TA的资源

纯净的硅(初级)

6
 
仙猫 发表于 2014-3-10 09:20
结构体里也是可以写数组的,只是这样的写法可能会导致本来结构体内很清晰的各元素的意义变成看了不知所云的 ...

明白了,谢谢仙猫大神!
此帖出自编程基础论坛
 
个人签名我在想
我知道什么
 
 

回复

407

帖子

3

TA的资源

纯净的硅(初级)

7
 
仙猫 发表于 2014-3-10 09:20
结构体里也是可以写数组的,只是这样的写法可能会导致本来结构体内很清晰的各元素的意义变成看了不知所云的 ...

突然想起另一个问题我如果定义:
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;这样了?
此帖出自编程基础论坛
 
个人签名我在想
我知道什么
 
 

回复

407

帖子

3

TA的资源

纯净的硅(初级)

8
 
我测试了一下,可以,不知道有没有要注意 的地方;
不过INT只有两个字节,我用的是LONG!
此帖出自编程基础论坛
 
个人签名我在想
我知道什么
 
 

回复

135

帖子

0

TA的资源

纯净的硅(初级)

9
 
不知这样是否可行

        unsigned char *p_ch = &(aa.a1);
        for (unsigned char i = 0; i < 4; i++) {
                *(p_ch+i) = b[i];
        }
此帖出自编程基础论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

10
 
本帖最后由 JOKSON 于 2014-4-9 13:03 编辑

方法一:
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;
此帖出自编程基础论坛
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

11
 
共用体搞定,不麻烦
此帖出自编程基础论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

12
 

谢谢了,又找到适合我的了
此帖出自编程基础论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

13
 
系统给结构体和数组都是分配连续的存储空间的,LZ想实现什么样的赋值方式,不妨从这个角度考虑下
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 
在结构体里按数组下标操作是非常不爽的,,,,对齐啥的不说了,本身这件事就很反模式
此帖出自编程基础论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

15
 
谢谢了,又找到适合我的了
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表