C语言语法教程-结构体

2018-09-30

结构体中成员变量地址是连续的,结构体用于描述记录。

Create a struct

//----------------------------
//struct1.c
//创建一个结构体,给结构体成员赋值,并输出一个成员值。
//----------------------------
#include <stdio.h>
struct teacher
{
/*
no、name、sex是成员
*/
    int no;
    char *name;//将存储字符串的变量声明为指针的形式,下面会谈到。
    char *sex;
};//使用中括号括起成员列表,后面加上分号
/*
上面是结构体声明,也可以放在main函数里面。
struct是结构体关键字,teacher是结构体名,struct teacher是结构体类型。
*/

int main(int argc, char const *argv[])
{
    struct teacher tech1;//定义一个结构体变量tech1,再次说明,teacher是结构体名。另外,丢掉struct也是可以的。
    tech1.no=1001;//成员赋值
    /*
    在声明结构体的时候,将存储字符串的变量声明为指针的形式,就可以在main函数中使用下面这种形式进行字符串变量赋值了。
    */
    tech1.name="wangfang";
    tech1.sex="女";
    //也可以这样:struct teacher tech1 = {1001,"wangfang","女"};不可以分开哟。
    struct teacher *p;//定义一个指向结构体的指针变量p
    /*
    一个指向变量的指针表示的是占内存中起始位置,一个指向结构体的变量的指针表示的是这个结构体变量占内存中的起始位置,同样它也可以指向结构体变量数组。
    为啥指针变量非要是struct teacher类型。因为通过指针变量存储的地址可以访问此地址以及后续地址所存储的内容,但是如何解析这个内容呢?
  所以要给指针声明类型,那么声明什么样的类型呢?显然,你要解析出什么样的类型就声明什么样的类型,你是要按访问的类型解析,所以指针类型和其所指向的变量类型一致。
    */
    p=&tech1;//使用取地址符将结构体变量的地址给指针p
    printf(p->sex);
    /*
    使用p->sex这样的形式访问成员,这里的箭头与指针搭配。也可以用tech1.sex,或者把tech1换成指针也可以,像这样(*p).sex。
    */
    return 0;
}

Create a struct pointer

//-------------------------------------
//--- struct2.c
//--- 介绍结构体指针,通过指针访问结构体成员值。
//-------------------------------------
#include <stdio.h>
struct teacher
{
    int no;
    char name[10];
    char sex[10];
};

int main(int argc, char const *argv[])
{
    struct teacher tech1;
    struct teacher *p;
    p=&tech1;
    scanf("%d",&(p->no));//p->no通过指针取出了成员变量no;&(p->no)取出了该成员变量的地址
    printf("%d",tech1.no);

    scanf("%s",p->sex);
    /*
    p->sex通过指针取出了字符数组成员变量sex;而p->sex就是字符数组的首地址。如果成员变量sex是指针,像struct1.c那样,那么scanf("%s",p->sex)是行不通的。
    */
    
    printf("%s",tech1.sex);//也可以用printf(tech1.sex)
    return 0;
}

Create a struct array

//-------------------------------------
//--- struct3.c
//--- 介绍结构体数组
//-------------------------------------
#include <stdio.h>
struct teacher
{
	int 	no;
	char 	name[10];
	char 	sex[10];
}tech[3]={
		{1001,"wang fang", "女"},
		{1002,"zhou yu", "女"},
		{1003,"zhang han", "女"}};
int main(int argc, char const *argv[])
{
	struct teacher *p;
	p=tech;//指针指向结构体数组
	printf("%s",p->sex);
	return 0;
}
/*
p+1表示数组中第2个元素tech[1]的起始地址
*/

Create an union

//-------------------------------------
//--- struct4.c
//--- 介绍共用体(联合体)
//-------------------------------------

#include <stdio.h>
typedef struct
{
	int 	        no;
	char 	name[10];
	char 	sex[10];
	int 	        job;
	union//这是联合体关键字,联合体成员共用一块内存单元,共有首地址,内存单元长度由占用空间最大的成员决定。同一时刻只有一个成员有效。
	{
		int 	class;//学生有班级无职称
		char 	prof[20];//教师有职称无班级
		//教师和学生只能选择一种属性,故适合用联合体。至于引用,就像这样staf[2].category.class。
	}category;
}STAFFER;
//使用typedef对结构体重新定义后,结构体类型为STAFFER

int main(int argc, char const *argv[])
{
	STAFFER staf[20];
	//code//
	return 0;
}

原文地址:https://www.cnblogs.com/feicaixian/p/9728410.html