C语言入门-结构类型

发布时间:2020-12-23 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了C语言入门-结构类型编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、声明结构类型

#include <stdio.h>


int main(int argc,char const *argv[])
{
	// 声明结构类型
	struct date
	{
		int month;
		int day;
		int year;
	};
	
    // 使用自定义的类型
	struct date today;

	today.month = 9;
	today.day = 30;
	today.year = 2019;

	printf("Today is date is %i-%i-%i\n",today.year,today.month,today.day);


	return 0;
}

二、在函数内/外 ?

  1. 和本地变量一样,在函数内部声明的结构类型只能在函数内部使用
  2. 所以通常在函数外部声明结果类型,这样就可以被多个函数使用了
#include <stdio.h>

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

int main(int argc,char const *argv[])
{
	
	struct date today;

	today.month = 9;
	today.day = 30;
	today.year = 2019;

	printf("Today is date is %i-%i-%i\n",today.day);

	return 0;
}

三、声明结构的形式

struct point{
    int x;
    int y;
}

struct point p1,p2;

// 其中p1和p2都是point
// 里面有x和y的值

还有另外一种形式:

struct{
    int x;
    int y
}p1,p2 ;
// p1和p2都是一种无名结构,里面有x和y

当然了,还有一种更加常用的形式

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

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

四、结构的初始化

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

int main(int argc,char const *argv[])
{
	struct date taday = {9,30,2019};
	struct date thismonth = {.month=9,.year=2019};

	printf("Today is date is %i-%i-%i\n",taday.year,taday.month,taday.day );
	printf("This month is %i-%i-%i\n",thismonth.year,thismonth.month,thismonth.day);

	return 0;
}
// Today is date is 2019-9-30
// This month is 2019-9-0

结构成员

  1. 结构和数组有点像
  2. 数组用[]运算符和下标访问其成员 a[10] = 10;
  3. 结构用“ . " 运算符和名字访问其成员 today.day , student.firstName

结构运算

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

结构指针

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

五、结构与函数

结构作为函数参数

int numberOfDays(struct date d);
  1. 整个结构可以作为参数的值传入函数
  2. 这时候是在函数内新建一个结构变量,并复制调用者的结构的值
  3. 也可以返回一个结构
  4. 这与数组完全不同

输入结构

  1. 没有直接的方式可以一次scanf一个结构
  2. 如果我们打算写一个函数来读入结果
#include <stdio.h>

struct point
{
	int x;
	int y;
};

void getStruct(struct point p);
void output(struct  point p);

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


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

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


// 2
// 3
// 2,3
// 0,0
  1. 但是读入的结构如何送回来呢?
  2. 记住c语言函数在调用时是传值的,所以函数中的p与main中的y是不同的

解决的方案

  1. 之前的方案,把一个结构传入函数,然后在函数中操作,但是没有返回回去
    • 问题在于传入函数的是外面那个结构体的克隆体,而不是指针
    • 传入结构和传入数组是不同的
  2. 在这个输入函数中,完全可以创建一个临时的结构变量,然后把这个结构返回给调用者,但这并不常用,了解即可
#include <stdio.h>

struct point
{
	int x;
	int y;
	
};

struct point getStruct(void);
void output(struct  point p);

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


// 这里返回一个struct
struct point getStruct(void){

	struct point p; 
	scanf("%d",p.y);
	return p;
}

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

// 5 6
// 5,6
// 5,6
  1. 最常用的就是结构指针作为参数

六、指向结构的指针

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 point* getStruct(struct point *p);
void output(struct point p);
void print(const struct point *p);


int main(int argc,char const *argv[])
{
	struct point y = {0,0};
	getStruct(&y);
	output(y);
	output(*getStruct(&y));
	print(getStruct(&y));

	return 0;
}

struct point* getStruct(struct point *p)
{
	scanf("%d",&p->x);
	scanf("%d",&p->y);
	printf("%d,p->x,p->y);
	return p;
}

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

void print(const struct point *p)
{
	printf("%d,p->y);
}


总结

以上是编程之家为你收集整理的C语言入门-结构类型全部内容,希望文章能够帮你解决C语言入门-结构类型所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!