C语言之结构体

目录

结构体类型

声明结构的形式

结构体与函数

结构体与指针

结构体数组

typedef(自定义数据类型)


结构体类型

  • 定义结构体的一般形式为:
struct 结构体名{
成员列表
};

在成员表列中可以是几种基本数据类型,也可以是结构体数据类型。struct 类型名{} 变量;后的分号不能漏。

声明结构的形式

形式1:

struct point{
    int x;
    int y;
};

struct point p1,p2;

p1和p2都是point里面有x和y的值
形式2:

struct{
    int x;
    int y;
}p1,p2;

p1和p2都是一种无名结构,里面有x和y

形式3:

struct point{
    int x;
    int y;
};

struct point p1,p2;

p1和p2都是point里面有x和y的值t
 

对于第一和第三种形式,都声明了结构point。但是第二种形式没有声名point,只是定义了两个变量
例子:

#include<stdio.h>

int main(int argc, char const *argv[])
{
	struct date{
		int month;
		int day;
		int year;
	};
	struct date today;
	
	today.month=07;
	today.day=31;
	today.year=2014;
	
	printf("Today's date is %i-%i-%i.\n",today.year,today.month,today.day);
	
	return 0;
}

结构成员

  • 数组用[]运算符和下标访问其成员,a[0]=10
  • 结构用.运算符和名字访问其成员,形式<结构体类型变量名>.<成员名>,如today.day  student.firstName  p1.x  p1.y
     

结构运算

  • 要访问整个结构,直接用结构变量的名字
  • 对于整个结构,可以做赋值、取地址,也可以传递给结构参数,如:
  • p1=(struct point){5,10};//相当于p1.x=5;p1.y=10;  
  • p1=p2; //相当于p1.x=p2.x;p1.y=p2.y;

结构指针

  • 和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
  • struct date*pDate=&today;
     

结构体与函数

结构作为函数参数

  • 整个结构可以作为参数的值传入函数
  • 这时候是在函数内新建一个结构变量,并赋值调用者的结构的值
  • 也可以返回一个结构
  • 和数组不同

输入结构

  • C语言在函数调用的时候是传值的
  • 传入结构和传入数组是不同的

例子:

#include<stdio.h>

struct point{
int x;
int y;
};

void getStruct(struct point);
void output(struct point);
void main(){
struct point y={0,0};
getStruct(y);
output(y);}

void getStruct(struct point p){
scanf("%d",&p.x);
scanf("%d",&p.y);
printf("%d,%d",p.x,p.y);}

void output(struct point p){
printf("%d,%d",p.x,p.y);}

结构体与指针

定义形式:struct  结构体名  *结构体指针名

指向结构的指针

struct date{
int month;
int day;
int year;
}myday;

struct date *p=&myday;

(*p).month=12;
p->month=12;
用->表示指针所指的结构变量中的成员


结构体数组

嵌套的结构

struct point{
    int x;
    int y;
};
struct rectangle{
struct point p1;
struct point p2;
};

如果有变量struct rectangle r;就可以有:
r.pt1.x、r.pt1.y,r.pt2.x和r.pt2.y
如果变量有定义:
struct rectangle r,*rp;
rp=&r;
那么下面的四种形式是等价的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
d
但是没有rp->pt1->x(因为pt1不是指针)


typedef(自定义数据类型)

  • C语言提供了一个叫做typedef的功能来声明一个已有的数据类型的新名字。比如:typedef int Length;
  • 使得Length称为int类型的别名。
  • 这样,Length这个名字就又可以代替int出现在变量定义和参数声明的地方了:
  • Length a,b,len;
  • Length numbers[10];

typedef声明新的类型的名字

  • 新的名字是某种类型的别名
  • 改善了程序的可读性
     
typedef long int64_t;
typedef struct ADate {
int month;
int day;
int year;
}Date;

int64_t i=100000000000;
Date d={9,1,2005};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值