C语言结构体学习笔记
1.结构类型
基本构成:
struct 结构体名 类型名 成员名
例:
struct student
{int num;
char name[9];
char sex;
int age;
double score;};(最后分号不能漏)
结构变量的定义:
先声明结构体类型再定义变量名;
struct student student1,student2;
通常在函数外声明结构
声明结构的形式:
1.基本形式如上;
2.无名结构
struct {
int x;
int y;
}p1,p2;
3.同时定义结构类型和结构变量
struct point{
int x;
int y;
}p1,p2;
初始化
- 按成员顺序赋值
struct point p1={2,3};
- 分别给成员赋值
访问结构中的成员用结构变量名,成员名;
struct point p2={.y=3,.x= 2};
结构运算
p1=(struct point){2, 3}; >>p1.x=2,p1.y=3;
p1=p2>>p1.x=p2.x,p1.y=p2.y;
结构取地址要用&;
2.结构与函数
结构作为函数参数
可以返回一个结构,但不会改变原本的结构;
输入结构
无法直接scanf一个结构;
设计函数输入结构:
令函数返回一个结构值再令要赋值的结构与之相等
#include<stdio.h>
struct re{
int e;
int r;
};
struct re getstruct(void);
void putstruct(struct re p);
int main(){
struct re k=getstruct();
putstruct(k);
return 0;
}
struct re getstruct(void){
struct re p;
scanf("%i %i",&p.e,&p.r);
return p;
}
void putstruct(struct re p){
printf("%i %i",p.e,p.r);
}
用指针作为参数向函数传入结构:
指针访问结构成员:
struct date{
int y;
int m;
int d;}today;
struct date *p=&today;
指针访问:***p->y=12;==(p).y=12; ==today.y=12;
#include<stdio.h>
struct re{
int r;
int e;
};
struct re *getstruct(struct re*o);
void output(struct re o);
void print(const struct re *o);
int main(){
struct re k={0,0};
struct re *f=getstruct(&k);
output(k);
// output(*f);
// print(f);
output(*getstruct(&k));//*getstruct(&k)就是getstruct(&k)所指的结构,
print(getstruct(&k));//在函数中以另一函数为参数时,另一函数会运行;
return 0;//此处getstruct会运行三遍,所以需输入三次
}
struct re* getstruct(struct re*o){
scanf("%d%d",&o->r,&o->e);
return o;
}
void output(struct re o){
printf("%d %d\n",o.r,o.e);
}
void print(const struct re *o){
printf("%d %d\n",o->r,o->e);
}
3.结构中的结构
结构数组
struct date{
int y;
int m;
int d;};
struct date d[n];>>有n个含有y,m,d成员的结构变量,分为d[0]~d[n-1]
赋值:
struct date d[]={{1972,8,26},{2004,11,23}};>>struct date d[0]=(struct date){1972,8,26};struct date d[1]=(struct date){2004,11,23};
结构中的结构
#include<stdio.h>
struct who{
char name[100];
int age;
char sex;
};
struct two{
struct who first;//已定义two中的who类型变量名为为first和second
struct who second;
};
int main(){
struct two jokerandbatman;
jokerandbatman.first.name=joker;
jokerandbatman.first.age=28;
jokerandbatman.first.sex=x;
jokerandbatman.second.name=batman;
jokerandbatman.second.age=83;
jokerandbatman.second.sex=x;
}
访问单个成员需从外部结构开始访问;
struct two r,*rp;
*rp=&r;
r.first.name<==>rp->first,name
结构中的结构的数组
struct two class[n];
则class[i] (0<=i<n)为一个two结构体;
访问使用class[i].
赋值用{}包含同一结构层次,以,分隔。