C语言结构体

目录

1.什么是结构体

2.输出结构体里面的成员变量

3.结构体的自引用

4.结构体变量的大小

练习:算出下列结构体大小


1.什么是结构体

结构体是由一批数据组合而成的结构型数据组,成结构型数据的每个数据称为结构型数据的“成员”

例如描述一个学生,成员包含了学生的属性:姓名,年龄,电话和性别.生成了s1,s2,s3三个全局变量

C语言结构体_第1张图片

下面是创建结构体变量

int main() {
    //创建结构体变量 局部变量
    struct Stu s = { "张三",20,"123456","女" };
    return 0;
}

 当然,为了方便创建,还可以使用另外一种创建形式

C语言结构体_第2张图片

//可以看到,只要用Stu +xxx就能创建结构体变量了!!

 int main() {
    //创建结构体变量 局部变量
    Stu s1 = { "张三",20,"120","女" };
    return 0;
}

另外,还有一种比较特殊结构体变量------匿名结构体变量

C语言结构体_第3张图片

 int main() {
    s.a = 11;
    s.c = 'a';
    printf("%d\n", s.a);
    printf("%c\n", s.c);
    return 0;
}

这种结构体适合只用一次的情况!!

 2.输出结构体里面的成员变量

下面声明了两个结构体,以变量.成员的形式输出数据,注意,T结构体里面又放了结构体S成员变量!!

struct S {
	int a;
	char c;
	char arr[20];
	double d;
};

struct T {
	char ch[10];
	struct S s;
	char *pc;
};

int main() {
	char arr[] = "hello sun";
	struct T t = { "hehe",{100,"w","hello word",3.14}, arr };
	printf("%s\n", t.ch);
	printf("%s\n", t.s.arr);
	printf("%lf\n", t.s.d);
	printf("%s\n", t.pc);

	return 0;
}

 下列下面两个函数打印的形式:

一种是按照指针形式打印(结构体指针指向结构体时),打印的时候用.符号来打印是无效的;

一种是普通的值传递打印

typedef struct Stu {
	//成员变量
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stu;

void Print1(Stu s) {
	printf("name: %s\n", s.name);
	printf("age: %d\n", s.age);
	printf("tele: %s\n", s.tele);
	printf("sex: %s", s.sex);
}

void Print2(Stu* s) {
	printf("name: %s\n", s->name);
	printf("age: %d\n", s->age);
	printf("tele: %s\n", (*s).tele);
	printf("sex: %s", s->sex);
	//printf("sex: %s", s.sex);//error 不可用

}

int main() {
	Stu s = { "李四",40,"155","男" };
	Print1(s);
	Print2(&s);
	return 0;
}

3.结构体的自引用

链表作为一种数据结构,是一种典型的自引用的结构体,

//链表形式
struct Node
{
	int data;
	struct Node* next;
};

int main() {
	struct Node n1;
	printf("%d\n",sizeof(n1)) ;
	//32位平台下,指针是4个字节,所以Node结构体的大小为4+4=8个字节
	//64位平台下,指针是4个字节,所以Node结构体的大小为4+4=8个字节	
	return 0;
}

模拟出拥有5个元素的链表

C语言结构体_第4张图片

//下面代码有什么错误呢?
typedef struct  {
    int data;
     Node* next;
}Node;

C语言结构体_第5张图片

//,Node先未被定义,也就是先执行了重命名,所以报错了!!

下面这种声明是正确的!!

typedef struct Node {
	int data;	
	struct Node* next;	
}Node;

int main() {
	struct Node n1;
	Node n2;
	return 0;
}

4.结构体变量的大小

先看看下面的代码,计算出大小

struct S1
{
	char c1;
	int a;
	char c2;
};

struct S2
{
	char c1;
	char c2;
	int a;

};

int main() {
	struct S1 s1 = { 0 };    //初始化
	printf("%d\n", sizeof(s1));

	struct S2 s2 = { 0 };
	printf("%d\n", sizeof(s2));

	return 0;
}

欲计算,先要对结构体的对齐规则有所了解

(1).第一个成员在与结构体变量偏移量为0的地址处,

(2)其他变量要对齐到某个他的大小(对齐数)的的整数倍的地址处

对齐数=编译器默认一个对齐数与该成员大小的较小值

我用的VS它的对其数是8

(3)最后结构体的总大小为最大对齐数(成员变量中最大的哪个!!)的整数倍

按照上述规则,分析下s1的大小

C语言结构体_第6张图片

 所以s1的大小为12

分析下s2的大小

C语言结构体_第7张图片

 所以得到s2的大小是8

练习:算出下列结构体大小

struct S3
{
    double d;
    char c;
    int i;
};

struct S4
{
    char c1;        
    struct S3 s3;  
    double d;       
};

你可能感兴趣的:(C语言,c语言,c++,数据结构,开发语言)