| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1994 人关注过本帖
标题:结构体的初始化
只看楼主 加入收藏
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
结帖率:70%
收藏
 问题点数:0 回复次数:17 
结构体的初始化
在定义的一个结构体中
  struct student
     {
            char name[10];
            float score;
            char sex;
            };
     struct student a={"famin",100,'M'};可以这样初始化,但假如我要一个一个的初始化改怎么样呢?为什么对name的初始化a.name={"famin"};不对呢?
搜索更多相关主题的帖子: 结构体 name student char famin 
2008-05-08 23:18
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
用strcpy

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-08 23:19
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
收藏
得分:0 
回复楼上的
书上就是用strcpy的,但我想知道a.name={"famin"};为什么不行,你告诉我用strcpy好象答非艘问吧?我要的是原因

在虚拟的世界中寻找目标。
2008-05-08 23:22
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
因为你在声明的时候可以指向一个常量空间,
但是赋值的时候就不行
你又不愿意声明时候赋值,就只能用字符串拷贝,或者给数组逐个赋值
回答完毕

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-08 23:24
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
回楼主是不可以的..在你声明变量的s的时候name就定了..
当你定义为struct student a的时候,
里面的数组是被初始化为空的,由于数组的名字是常量后面的赋值是不合法的;
撇开结构体:
1.char c[100]={"famin"};ok
2.char c[100];
c={"famin"}; wrong
而struct student a={"famin",100,'M'};
可以看成初始化char c[100]={"famin"};

[[it] 本帖最后由 sunkaidong 于 2008-5-8 23:37 编辑 [/it]]

学习需要安静。。海盗要重新来过。。
2008-05-08 23:25
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
收藏
得分:0 
感谢moonwalker
moonwalker 说对了,因为在定义的时候name[10]表示一个数组而在引用的时候name[10]则表示数组name[10]的第10个元素

在虚拟的世界中寻找目标。
2008-05-08 23:29
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
我感觉你理解的还是不对。。。

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-08 23:31
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
"famin"这个东西是const char*
a.name是char *
可以把const char 或char型数据的地址赋给const char *
但是不能把const char型数据的地址赋给char *
还真是绕口

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-08 23:43
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
其实很简单。
{"fname"}这样的东西,有个专门的名字,LZ你记住,叫做“初始化参数表”。你看一对大括号围着的,像不像一个表格呢?这样的表格是C语言的福利。可以让你[bo]在定义时[/bo]向结构体啊,数组啊里面复制东西。注意,是复制东西,换句话说这其实就是strcpy,只不过是系统帮你完成了,不需要你显式调用而已。
而既然叫做“初始化”参数表。自然只能够在初始化的时候使用。一旦初始化结束,就再没有“后悔药”吃了。所以写a.name="fname";不对,这个时候,你已经初始化结束了。当然你可以使用strcpy,这和使用初始化参数表的效果是一样的~~~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-09 03:16
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
回复 8# 的帖子
你确定??
a的类型是char[10],绝对不是char*。在数组传参的时候,a会自动退化为const char*,然后再[bo]传值[/bo]给char*。所以看起来好像传给函数的时候,和char*是一样的。但是char[10]和char*有着本质的不同!
顺便说一下因为C只有传值这一种传参方式,所以const和non-const的区别不明显。你可以试试看,将char[10]传给void func(char* &str),看看是什么结果。
GCC显示“无法将临时char*变量赋给非常量引用”,这印证了我关于数组退化为指针的观点。VC显示“无法将char[10]转换为char *&,这印证了我关于数组是一种独立类型的观点。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-09 03:23
快速回复:结构体的初始化
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016958 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved