结构体C语言程序
‘壹’ c语言,结构体
结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。[1]
在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。[1]
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。[1]
结构体的大小与内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。[1]
规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。[1]
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。[1]
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。[1]
C++中的结构体
在C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而不是private。
‘贰’ C语言结构体的程序
第一段代码我觉得应该选d;
第一个printf不用说打印的就是a的元素;说说b,b=a;把a赋给b;gender和score不用说;name是个指针,所以复制给b的也是个指针,a的name和b的name指向同一块类存地址,然后调用f();函数把b的name指针传递进去,在f()函数中开辟一块空间并把这块空间的地址赋给b的name指针,f()函数结束后,在f();中开辟的空间并未消失了,f()函数中b。name指针是局部的,f();结束后b的name指针在栈中被释放了,所以b。name和a的name指正还是一样的,
第二段代码就选a;
在struct stu中name是个字符数组,在创建stu的一个对象后,就有空间储存字符,b=a;你懂的
然后调用f()函数,把qian写入b的name的那块空间,空间中的字符串就变为了qian,
‘叁’ c语言里面的结构体是什么意思
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。
结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
(3)结构体C语言程序扩展阅读
将一个结构体变量中的数据传递给另一个函数,有下列3种方法:
(1) 用结构体变量名作参数。一般较少用这种方法。
(2) 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
(3) 用结构体变量的引用变量作函数参数。
在软件开发过程中,常常需要动态地分配和撤销内存空间,例如对动态链表中结点的插入与删除。C语言中是利用库函数malloc和free来分配和撤销内存空间的。
‘肆’ C语言程序 结构体、共同体
#include<stdio.h>
structDate
{
intyear;
intmonth;
intday;
};
structPerson//加上typedefme就是变量类型,去掉就是实例变量
{
charname[10];
charsex;
structDatebirthday;
charID[19];
charemail[60];
}me;
intmain()
{
printf("请输入各人信息<姓名、性别<‘m’或‘f’>、出生年月日、身份证号、电子邮箱>");
scanf("%s%c%d%d%d%s%s",me.name,me.sex,&me.birthday.year,&me.birthday.month,&me.birthday.day,me.ID,me.email);
printf("姓名:%s 性别:%c 出生日期:%d年%d月%d日 身份证号:%s 电子邮箱:%s ",me.name,me.sex,me.birthday.year,me.birthday.month,me.birthday.day,me.ID,me.email);
return0;
}
‘伍’ C语言编程:定义一个汽车结构体
按照题目要求编写的C语言汽车结构体程序如下
#include<stdio.h>
struct car{
float petrol;
}c1={0};
struct car refuel(struct car c){
c.petrol=c.petrol+2;
return c;
}
int main(){
int i;
for(i=0;i<5;i++){
c1=refuel(c1);
printf("%.2f ",c1.petrol);
}
return 0;
}
‘陆’ c语言结构体是什么
在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。
结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
结构体作用:
结构体和其他类型基础数据类型一样,例如int类型、char类型,只不过结构体可以做成你想要的数据类型。以方便日后的使用。
在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
‘柒’ c语言中关于结构体
结构体数组stu的第t+1个元素,其中的字符串num的首地址
从功能上说,这个就是输入第t+1个学生的学号
‘捌’ 写一个关于结构体的 C语言程序
enum WeekDay {Monday=0, Tuesday, Wednesday, Thursday, Friday, Staturday, Sunday};
char *name[] = { "Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"
};
typedef struct date
{
int year;
int month;
int day;
enum WeekDay weekday;
}date;
int main()
{
date d;
printf("Day: "); fflush(stdout);
scanf("%d",&d.day);
printf("Month: "); fflush(stdout);
scanf("%d",&d.month);
printf("Year: "); fflush(stdout);
scanf("%d",&d.year);
if ((d.month == 1) || (d.month == 2)){
d.month += 12;
d.year--;
}
d.weekday = (WeekDay)((d.day + 2*d.month + 3*(d.month+1)/5 + d.year + d.year/4 - d.year/100 + d.year/400) % 7);
printf("%d-%d-%d is %s.\n",d.year, d.month, d.day, name[d.weekday]);
return 0;
}
其中的公式参考:
http://www.cppblog.com/qywyh/articles/14021.html
希望能解决你的问题
‘玖’ 分析c语言程序---结构体程序
union是用来定义联合体的关键字,union维护足够的空间来置放多个资料成员中的最大的“一种”,而不是为每一个资料成员配置空间,在union中所有的资料成员共用一个空间,同时间只能储存其中一个成员的资料。
可以得出该共用体在内存中占用4个字节。
k.a[0]=10000; k.a[1]=15000; 为k的int a[2]成员赋值,即该内存的内容是[00111010] [10011000] [00100111] [00010000]将这4个字节换算成符点数就是0.001161.
scanf ("%s",k.d); //k.d[]="abcd"
因为scanf把4个输入压栈后再出栈对4个字符变量赋制值,则内存结构为:
[01100100] [01100011] [01100010] [01100001]
d[3] d[2] d[1] d[0]
c(4个字节)
b(前两个字节)
a[1](前两个字节) a[0](后两个字节)
将这4个字节换算成符点数c就是:16777999408082104400000.000000.
至于上面的数字是怎么得来的,那要考虑浮点数在计算机中的储存结构问题了.在存储1个浮点数的32位内存中,
第一位是符号位,下来的8位是指数位,后面的23位是尾数位.
[01100100] [01100011] [01100010] [01100001]
换算成浮点数的算法是:
第一位为0:正数
下来的8位是:[11001000],减去[01111111]为[1001001].所以指数为73
再下来的23位是1100011[01100010] [01100001].所以尾数为
(1.11000110110001001100001)B = 2^0+2^(-1)+2^(-1)+2^(-6)+2^(-7)+2^(-9)+2^(-10)+2^(-14)+2^(-17)+2^(-18)+2^(-23).
最后结果=底数^指数
可能你还会问为什么位数一样,结果还是有差距,那是因为浮点数的计算精度问题.浮点数的精度是有限的.