c语言结构体教程
① c语言结构体Struct怎么使用
在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:
struct 结构体名{
结构体所包含的变量或数组
};
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员(Member)。
结构体定义:
第一种:只有结构体定义
struct stuff{
char job[20];
int age;
float height;
};
第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义
//直接带变量名Huqinwei
struct stuff{
char job[20];
int age;
float height;
}Huqinwei;
也许初期看不习惯容易困惑,其实这就相当于:
struct stuff{
char job[20];
int age;
float height;
};
struct stuff Huqinwei;
第三种:如果该结构体只用一个变量Huqinwei,而不再需要用struct stuff yourname;去定义第二个变量。
那么,附加变量初始化的结构体定义还可进一步简化出第三种:
struct{
char job[20];
int age;
float height;
}Huqinwei;
把结构体名称去掉,这样更简洁,不过也不能定义其他同结构体变量了——至少我现在没掌握这种方法。
结构体变量及其内部成员变量的定义及访问。
要分清结构体变量和结构体内部成员变量的概念。
就像刚才的第二种提到的,结构体变量的声明可以用:
struct stuff yourname;
其成员变量的定义可以随声明进行: struct stuff Huqinwei = {"manager",30,185};
也可以考虑结构体之间的赋值:
struct stuff faker = Huqinwei;
//或 struct stuff faker2;
// faker2 = faker;
打印,可见结构体的每一个成员变量一模一样
如果不使用上边两种方法,那么成员数组的操作会稍微麻烦(用for循环可能好点)
Huqinwei.job[0] = 'M';
Huqinwei.job[1] = 'a';
Huqinwei.age = 27;
Huqinwei.height = 185;
结构体成员变量的访问除了可以借助符号".",还可以用"->"访问。
(1)c语言结构体教程扩展阅读:
结构体数组与结构体指针:
一个结构体变量中可以存放一组数据;如一个学生的学号、姓名、成绩等数据。如果有10个学生的数据需要参加运算显然应该用数组,这就是结构体数组结构体数组与以前介绍过的数值型数组不同之处:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。
结构体指针和其他类型的指针都是一样的理解,在32位平台不管啥类型的指针都占4个字节的空间。
结构体指针就是指向结构体变量的指针;如果一个指针变量中保存了结构体变量的首地址,那么这个指针变量就指向该结构体变量.通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的结构指针变量说明的一般形式为:
struct 结构体名 *结构体指针变量名struct student *p = &Boy; //假设事先定义了 struct student Boy。
② c语言中如何定义一个结构体
结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。
结构体的成员可以包含其他结构体,也可以包含指向自己结构体类型的指针,而通常这种指针的应用是为了实现一些更高级的数据结构如链表和树等。如果两个结构体互相包含,则需要对其中一个结构体进行不完整声明。
(2)c语言结构体教程扩展阅读:
一、结构体作用:
结构体和其他类型基础数据类型一样,例如int类型,char类型,只不过结构体可以做成你想要的数据类型,以方便日后的使用。
在实际项目中,结构体是大量存在的,研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。
结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。
二、结构体的大小与内存对齐:
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。
所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。
程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
三、结构体的规则:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2可推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
③ c语言结构体输入
number是指针,指向常量字符串,输入的时候,改变的其实是number的空间,也就是出现了野指针,导致程序出错
修改方式很简单,把char*number,改成char number[100]就可以了
只改定义一处,其他的不需要改动
具体大小,取决于你的需求
④ 用c语言!c语言!结构体编程。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedefstruct
{
charNo[20];
charname[20];
charauthor[20];
floatprice;
}BOOKINFO;
intmain()
{
BOOKINFOs[10];
inti;
for(i=0;i<10;i++)
{
printf(" 请输入第%d本书的书号书名作者价格(分别用空格间隔):",i+1);
scanf("%s%s%s%f",s[i].No,s[i].name,s[i].author,&s[i].price);
}
printf(" 请输入要查找的书名:");
chartemp[20];
scanf("%s",temp);
for(i=0;i<10;i++)
{
if(strcmp(temp,s[i].name)==0)
{
printf(" 找到! ");
printf("%s%s%s%.2f",s[i].No,s[i].name,s[i].author,s[i].price);
break;
}
}
if(i>=10)
{
printf(" 未找到!");
}
printf(" 请输入一个价格:");
floatt;
scanf("%f",&t);
for(i=0;i<10;i++)
{
if(s[i].price>t)
{
printf("%s%s%s%.2f ",s[i].No,s[i].name,s[i].author,s[i].price);
}
}
return0;
}
⑤ C语言结构体的用法,
结构体的使用,首先要定义:
#include<stdio.h>
structstudent
{
charname[10];
intnum;
intage;
};//注意要分号
//然后就可以使用了:
voidmain()
{
structstudents;
structstudent*p=&s;//指针指向,可以不用指针
printf("inputname:");
gets(s.name);//若使用指针,则:gets(p->name);
printf("inputnum:");
scanf("%d",&s.num);//指针的写法:scanf("%d",&p->num);
printf("inputage:");
scanf("%d",&s.age);
//输出结果:
printf("name num age ");
printf("%s %d %d ");
}
结构体类似于数组,但结构体能定义不同的数据类型,这也是它的特别之处
⑥ 用C语言(结构体)编写程序
|正好有个现成的:#include"stdio.h"
#define yes 1
#define no 0typedef struct date
{
int year;
int month;
int day;
}DATE;
long timedef(DATE d1,DATE d2);
int leap(int year);
int main()
{
DATE date1,date2;
date1.year=2008;
date1.month=11;
date1.day=1;
date2.year=2009;
date2.month=12;
date2.day=1; printf("%ld\n",timedef(date1,date2));}
int leap(int year)
{
if(year%400==0 ||(year%4==0&&year%100!=0))
return yes;
else
return no;
}
long timedef(DATE d1,DATE d2)
{
int i;
long day=0,dayt1=0,dayt2=0;
int d[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
for(i=d1.year;i<d2.year;i++)
if(leap(i)==no) day+=365;
else day+=366; for(i=1;i<d1.month;++i) dayt1+=d[leap(d1.year)][i];
dayt1+=d1.day; for(i=1;i<d2.month;++i) dayt2+=d[leap(d2.year)][i];
dayt2+=d2.day; return day+dayt2-dayt1;
}
⑦ C语言结构体定义
C语言结构体定义:struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。
结构体是C语言中聚合数据类型(aggregatedatatype)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
(7)c语言结构体教程扩展阅读
1、struct是声明结构体类型时必须使用的关键字,不能省略。“结构体”这个词是根据英文单词structure译出的。
2、structSTUDENT是定义的数据类型的名字,它向编译系统声明这是一个“结构体类型”,包括name、num、sex、age、score、addr等不同类型的项。
3、structSTUDENT与系统提供的int、char、float、double等标准类型名一样,都是数据类型,具有同样的作用,都是用来定义变量的。
⑧ c语言结构体怎么用函数实现
#include<stdio.h>
#include<malloc.h>
structstu//结构体
{
intage;
floatscore;
charname[100];
};
voidshuru(intlen,stu*pArr)
{
inti;
for(i=0;i<len;i++)
{
printf("请输入第%d个学生的信息 ",i+1);
printf("name=");
scanf("%s",pArr[i].name);
printf("age=");
scanf("%d",&pArr[i].age);
printf("score=");
scanf("%f",&pArr[i].score);
}
return;
}
intmain(void)
{
intlen,i;
structstu*pArr,t;
printf("请输入学生的个数: ");
printf("人数=");
scanf("%d",&len);
pArr=(structstu*)malloc(len*sizeof(structstu));
shuru(len,pArr);
for(i=0;i<len;i++)
{
if(pArr[i].score<pArr[i+1].score)
{
t=pArr[i+1];
pArr[i+1]=pArr[i];
pArr[i]=t;
}
}
i=0;
printf(" 排序后的学生信息为 ");
for(i=0;i<len;i++)
{
printf("name=%s ",pArr[i].name);
printf("age=%d ",pArr[i].age);
printf("score=%f ",pArr[i].score);
printf(" ");
}
return0;
}
这样就行了,你的排序还没实现, 仿照输入的函数实现就OK
⑨ c语言中结构体怎么写
以struct打头,后面可以跟结构体名称,然后大括号中写出结构体组成,比如:
struct Student { int number; float score[5]; };
其中Student就是结构体名称,这个名称可以当作自定义的数据类型来使用
Student a[10];