使用结构变量时必须加结构名吗?c语言全局变量的使用

C语言中结构体变量之间赋值 - 为程序员服务
C语言中结构体变量之间赋值
最近,我阅读了某新员工小刘写的C语言代码,发现其对结构体变量之间的赋值不是很熟悉。对于两个相同类型的结构体变量,他均采用的是逐个成员变量直接赋值的形式。如下的代码示例:
/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
* 文件名称:Struct2Struct.c
* 文件标识:无
* 内容摘要:结构体变量之间的赋值
* 其它说明:无
* 当前版本:V1.0
者:Zhou Zhaoxiong
* 完成日期:
**********************************************************************/
#include &stdio.h&
#include &string.h&
// 重定义数据类型
typedef unsigned char UINT8;
typedef unsigned int
typedef signed
// 定义结构体
typedef struct
szName[100];
szId[100];
} T_EmployeeI
/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期
* -------------------------------------------------------------------
Zhou Zhaoxiong
***********************************************************************/
INT32 main()
T_EmployeeInfo tEmployeeInfoSrc = {0};
// 源消息结构体
T_EmployeeInfo tEmployeeInfoDest = {0};
// 目的消息结构体
// 手动输入源消息
printf("Please input the source info: \n");
printf("Name: \n");
scanf("%s", tEmployeeInfoSrc.szName);
printf("Age: \n");
scanf("%d", &(tEmployeeInfoSrc.iAge));
printf("Id: \n");
scanf("%s", tEmployeeInfoSrc.szId);
// 将源消息赋给目的消息结构体中的各个变量
strcpy(tEmployeeInfoDest.szName, tEmployeeInfoSrc.szName);
tEmployeeInfoDest.iAge = tEmployeeInfoSrc.iA
strcpy(tEmployeeInfoDest.szId, tEmployeeInfoSrc.szId);
// 打印目的消息结构体中的各个变量的值
printf("The dest info is: Name=%s, Age=%d, Id=%s\n", tEmployeeInfoDest.szName, tEmployeeInfoDest.iAge, tEmployeeInfoDest.szId);
如上代码所示,tEmployeeInfoSrc和tEmployeeInfoDest是两个类型相同的结构体变量,tEmployeeInfoSrc(源结构体变量)中的各个成员变量已赋初值。现要使tEmployeeInfoDest(目的结构体变量)中的各个成员变量的值与tEmployeeInfoSrc中对应成员变量的值相同。小刘采用的方式是各个成员变量一一赋值。这虽然可以确保赋值操作的正确性,但并不是最优的方法。
针对以上代码,我们可以稍加修改,如下所示:
/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
* 文件名称:Struct2Struct.c
* 文件标识:无
* 内容摘要:结构体变量之间的赋值
* 其它说明:无
* 当前版本:V1.0
者:Zhou Zhaoxiong
* 完成日期:
**********************************************************************/
#include &stdio.h&
#include &string.h&
// 重定义数据类型
typedef unsigned char
typedef unsigned int
typedef signed
// 定义结构体
typedef struct
szName[100];
szId[100];
} T_EmployeeI
/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期
* -------------------------------------------------------------------
Zhou Zhaoxiong
***********************************************************************/
INT32 main()
T_EmployeeInfo tEmployeeInfoSrc = {0};
// 源消息结构体
T_EmployeeInfo tEmployeeInfoDest = {0};
// 目的消息结构体
// 手动输入源消息
printf("Please input the source info: \n");
printf("Name: \n");
scanf("%s", tEmployeeInfoSrc.szName);
printf("Age: \n");
scanf("%d", &(tEmployeeInfoSrc.iAge));
printf("Id: \n");
scanf("%s", tEmployeeInfoSrc.szId);
// 将源消息赋给目的消息结构体
tEmployeeInfoDest = tEmployeeInfoS
// 打印目的消息结构体中的各个变量的值
printf("The dest info is: Name=%s, Age=%d, Id=%s\n", tEmployeeInfoDest.szName, tEmployeeInfoDest.iAge, tEmployeeInfoDest.szId);
如上代码所示,我们可以直接将源结构体变量的值赋给目的结构体,将原来的三行代码缩减为一行。当一个结构体的成员变量较多时,各个变量逐一赋值显然过于繁琐,即采用直接赋值的方法更加简洁直观。
两个相同类型的结构体变量相互赋值的情况还有好多种,如下代码所示:
/**********************************************************************
* 版权所有 (C)2015, Zhou Zhaoxiong。
* 文件名称:Struct2Struct.c
* 文件标识:无
* 内容摘要:结构体变量之间的赋值
* 其它说明:无
* 当前版本:V1.0
者:Zhou Zhaoxiong
* 完成日期:
**********************************************************************/
#include &stdio.h&
#include &string.h&
// 重定义数据类型
typedef unsigned char UINT8;
typedef unsigned int
typedef signed
// 定义结构体
typedef struct
szName[100];
szId[100];
} T_EmployeeI
/**********************************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期
* -------------------------------------------------------------------
Zhou Zhaoxiong
***********************************************************************/
INT32 main()
T_EmployeeInfo tEmployeeInfoSrc
// 源消息结构体
T_EmployeeInfo *ptEmployeeInfoDest = NULL;
// 目的消息结构体
T_EmployeeInfo *ptEmployeeInfoMid = NULL;
// 中间消息结构体
// 手动输入源消息
printf("Please input the source info: \n");
printf("Name: \n");
scanf("%s", tEmployeeInfoSrc.szName);
printf("Age: \n");
scanf("%d", &(tEmployeeInfoSrc.iAge));
printf("Id: \n");
scanf("%s", tEmployeeInfoSrc.szId);
// 将源消息赋给目的消息结构体
ptEmployeeInfoDest = &tEmployeeInfoS
// 指针 = &变量
// 打印目的消息结构体中的各个变量的值
printf("The dest info is: Name=%s, Age=%d, Id=%s\n", ptEmployeeInfoDest-&szName, ptEmployeeInfoDest-&iAge, ptEmployeeInfoDest-&szId);
// 将目的消息赋给中间消息结构体
ptEmployeeInfoMid = ptEmployeeInfoD
// 指针 = 指针
// 打印中间消息结构体中的各个变量的值
printf("The mid info is: Name=%s, Age=%d, Id=%s\n", ptEmployeeInfoMid-&szName, ptEmployeeInfoMid-&iAge, ptEmployeeInfoMid-&szId);
// 改变目的消息结构体中的某个变量的值
ptEmployeeInfoDest-&iAge = ptEmployeeInfoDest-&iAge + 1;
// 将目的消息赋给源消息结构体
memcpy(&tEmployeeInfoSrc, ptEmployeeInfoDest, sizeof(T_EmployeeInfo)); // memcpy(&变量, 指针, 长度)
// 打印源消息结构体中的各个变量的值
printf("The source info is: Name=%s, Age=%d, Id=%s\n", tEmployeeInfoSrc.szName, tEmployeeInfoSrc.iAge, tEmployeeInfoSrc.szId);
指针和结构体是C语言的精华和难点所在,大家一定要在实战中学会它们的使用方法。
(本人微博:/zhouzxi?topnav=1&wvr=5,微信号:,欢迎关注!)
软件工程师的学习园地
原文地址:, 感谢原作者分享。
您可能感兴趣的代码共有 12251 人关注过本帖
标题:结构体中的变量数组该如何赋初值了?
来 自:桂林
等 级:论坛游侠
帖 子:92
专家分:133
结帖率:68.75%
&&已结贴√
&&问题点数:20&&回复次数:7&&&
结构体中的变量数组该如何赋初值了?
童鞋们,我初学C语哈!有个问题不是很清楚,而且自己老是出错,求解
struct IPNP
&&& int banben[4];
&&& int shoubu[4];
&&& int qufen[8];
&&& int zongchang[16];
&&& int biaoshi[16];
&&& int biaozhi[3];
&&& int pianyi[13];
&&& int shengcun[8];
&&& int xieyi[8];
&&& int jianyan[16];
我该如何给结构体中的数组赋值了?
搜索更多相关主题的帖子:
等 级:千里冰封
帖 子:1554
专家分:10000
ipnp.jianya[2]=3;
控制系统中的C是怎么样的?欢迎来群一起交流进步
来 自:桂林
等 级:论坛游侠
帖 子:92
专家分:133
回复 2楼 pauljames
等 级:新手上路
有两种方法,
&&&一是初始化定义
ipnp={1,2,3,4,12,3,43,22,45,……};
&&&&&二是用赋值或输入语句
ipnp.banben={1,2,3,4};
ipnp.shoubu{5,6,7,8};
scanf(&%d&,&ipnp.biaozhi);
等 级:新手上路
同意4楼,建议看下谭浩强&&结构体变量的引用&&章节。
等 级:论坛游民
帖 子:13
专家分:13
用这个“.”,成员运算符。对每个成员赋值。也可以定义时就初始化
等 级:论坛游侠
帖 子:35
专家分:154
如果你高兴的话,也可以这样:
&&& int *buf = (int *)&
&&& *buf = 123;
&&& *(buf+2) = 456;
或memcpy、strncpy:
&&&&&&&&int buf[76] = {123, 0, 456};
&&& memcpy(&ipnp, buf, 12);
[ 本帖最后由 yyqd2013 于
20:25 编辑 ]
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2389
专家分:13384
&&得分:10&
一个例子:
#include&stdio.h&
struct Mem
char Sex[30];
&&char Major[50];
&struct Mem mem2;
&struct Mem mem1={110192,&man&,24,&机械制造及其自动化&};
&printf(&%d,%s,%d,%s&,mem1.Num,mem1.Sex,mem1.Age,mem1.Major);
版权所有,并保留所有权利。
Powered by , Processed in 0.047846 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved今天看啥 热点:
C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?,变量最前面&
报错信息:error C2065: 'salary' : undeclared identifier
#include &stdio.h&
void main(){
printf("我的成绩是100分!");//不使用变量
//使用变量
salary = 100;
printf("我的成绩是%d分!",salary);
问题根源:编译器问题&&C89和C99
C89规定,在任何执行语句之前,在块的开头声明所有局部变量。
在C99以及C++中则没有这个限制,即在首次使用之前,可在块的任何位置都可以声明变量。
变量声明放在前面就不报错了&&&&&&
#include &stdio.h&
void main(){
//使用变量
salary = 100;
printf("我的成绩是100分!");//不使用变量
printf("我的成绩是%d分!",salary);
不同风格利弊
变量在函数开头定义:便于修改
变量就近定义:便于阅读
变量在块语句的开头定义:有的临时变量放在语句块开头,可以不用在函数开头定义,并且在使用完毕后释放空间,可以这么做,但不要无故添加花括号来提高代码的结构。
要达到最大的兼容跨平台性,还是放在函数开头定义吧
使用哪种方式,看实际情况+个人喜好!
我个人是比较喜欢就近定义的,觉得比较方便一点。
可是,现在使用的VC6.0,编译器可能是C89的,所以不得不用开头定义。
顺便提一提:该文件的后缀名为.c
在网上查了一下,有许多说法,列举一二(意思大同小异)
1.源文件保存为.c格式的话变量只能定义在最前,若保存为.cpp格式的话,变量定义较为灵活,不用在最前。
2.在C语言里,变量只能在函数的开头处声明和定义。在函数里要用到的变量必须要在开头处声明定义。声明定义的前面不能有任何其他非声明定义的语句。全局变量在函数体的外部声明定义。而C++里(.CPP文件是按C++标准编译的),只要在用到变量前对该变量进行声明定义就行了,位置不做特别要求。而C语言的就定了在一个模块里(函数、循环体等)先声明一切所需变量后才能进行相关操作的规定。
然而,把后缀名改为.cpp后,还是报错
void main()改为int main(void)就可以了
#include &stdio.h&
int main(void ){
//使用变量
salary = 100;
printf("我的成绩是100分!");//不使用变量
printf("我的成绩是%d分!",salary);
应该是语言的数据类型的问题吧???是不是呢?大神何处在~
(完,可待续)
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
C语言最近更新结构体变量定义时不能这样赋值?_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:447,733贴子:
结构体变量定义时不能这样赋值?收藏
如题,之前在哪见过一段代码,结构体变量在定义时,初始值的赋值方式貌似和下图类似:虽然一般情况下,这样也可以:但是,考虑到以后可能会往结构体里添加成员变量,成员变量的位置也可能会有变动,这种赋值方式有些不适合,因此就想起了第一张图所示的方法,但编译会报错。不知是否真的存在类似于第一张图所示的方法,求证实。
C99...GCC的意思是没有实现么...
gcc最新版4.7.2支持这种格式
VS2012的编译器不支持这种赋值方法,算了,还是放弃使用这个方法。
好像是c99呐,vs基本上不支持几条c99
你这种写法 在linux设备驱动中经常用到的写法static struct platform_driver my_driver = {
= my_probe,
= my_remove,
= THIS_MODULE,
= "my_dev",
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 c语言全局变量的使用 的文章

 

随机推荐