C语言结构体

Posted 简单就是幸福

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体相关的知识,希望对你有一定的参考价值。

结构体

1、简单概述

先了解结构体,可以更加方便的了解java中的类。

结构体:为了模拟一种复杂的事物,由多个简单的数据类型组成。使用结构体来满足我们最基本的需求。

首先看个入门案例:

# include <stdio.h>
// 定义一个结构体
struct Person{
	int id;
	int age;
	double price;
	char sex;
};
int main(void){
	
	// 使用结构体并进行赋值 ,这里的person是结构体变量
	struct Person person = {1,21,22.0,\'1\'}; 
	printf("person的id值是:%d\\n",person.id);
	printf("person的age值是:%d\\n",person.age);
	printf("person的price值是:%lf\\n",person.price);
	printf("person的sex值是:%c\\n",person.sex); 
	return 0;
} 

其实定义结构体有三种方式,但是另外两种不推荐使用,所以这里也就不再来进行介绍了。

但是第一种在使用的时候也有一点不好,就是还得写上struct这个结构体标识。

再来看结构体中引入指针:

# include <stdio.h>
struct Person{
	int id;
	int age;
	double price;
	char sex;
};
int main(void){
	
	// 使用结构体并进行赋值 
	struct Person person = {1,21,22.0,\'1\'}; 
	// 如果person是一个指针变量,那么给指针赋值就应该是person;但是如果不是一个指针变量,那么就应该是&person
	// 所以person不是一个指针变量,而是一个正常的变量 
	struct Person * pst = &person;
	pst->id = 22;
	pst->age = 23;
	pst->price = 25.0;
	pst->sex = \'0\';
	printf("person的id值是:%d\\n",pst->id);
	printf("person的age值是:%d\\n",pst->age);
	printf("person的price值是:%lf\\n",pst->price);
	printf("person的sex值是:%c\\n",pst->sex); 
	return 0;
}

查看控制台输出:

person的id值是:22
person的age值是:23
person的price值是:25.000000
person的sex值是:0

--------------------------------
Process exited after 0.01567 seconds with return value 0
请按任意键继续. . .

从这里得出来一个结论:如果前面是数据类型+变量名,那么这个变量名不是一个指针;如果声明的时候,是数据类型+*+变量名,那么这个变量是一个指针变量;

但是这里有一个特殊的,那么就是数组。int a[length],这里的a是一个指针变量,这个是比较特殊的。

如果想要使用指针来操作结构体,可以发现和结构体变量的使用有些不同。指针变量使用的是->来操作属性,而结构体变量使用的是.来进行操作。

pst->属性在计算机内部会被转换成(*pst).属性来进行使用。

1.1、总结

struct Person{
	int id;
	int age;
	double price;
	char sex;
};

这里定义了一个结构体,这个结构体由基本数据类型的组成,但是并非要求一定要是基本类型的组成。结构体是一个新的数据类型,是我们可以自己定义的。

作为了一种新的数据结构来使用。

2、简便写法

其实在看到大多数的程序中,看到并非是上面的书写方式,更多的是下面的写法。

# include <stdio.h>
typedef struct Person{
	int id;
	int age;
	double price;
	char sex;
} Person;
int main(void){
	
	Person person ={1,1,2.2F,\'1\'};
	printf("person中对应的id是:%d ,age是:%d,price是:%lf,sex是:%c",person.id,person.age,person.price,person.sex);	
	
	return 0;
} 

控制台输出:

person中对应的id是:1 ,age是:1,price是:2.200000,sex是:1
--------------------------------
Process exited after 0.02125 seconds with return value 0
请按任意键继续. . .

typedef,类型定义。也就是说这个关键字可以给一种数据类型起一个别名来使用。

使用struct Person这个数据类型,就相当于是使用Person,这里是typedef关键字起作用。

既然可以使用一种数据结构,那么也可以使用指针来进行表示:

# include <stdio.h>
typedef struct Person{
	int id;
	int age;
	double price;
	char sex;
} * PPN;
int main(void){
	
	printf("Person这种数据结构占的字节是:%d\\n",sizeof(struct Person));	// 24
	
	return 0;
} 

从这里可以看出来,typedef只是起了一个别名,但是并非是struct Person并不可用。

因为里面的属性占据的字节个数是:4+4+8+1=17,而结构体占据了24个,说明了结构体比里面的基本类型的所占的字节数要大。

使用指针来操作一下这个结构体,这里就是结构体最难的地方了:

# include <stdio.h>
# include <malloc.h>
typedef struct Person{
	int id;
	int age;
	double price;
	char sex;
} Person,* PPN;
int main(void){
	
	printf("Person这种数据结构占的字节是:%d\\n",sizeof(struct Person));	
	printf("Person这种数据结构占的字节是:%d\\n",sizeof( Person));	
	// 根据以前的方式照葫芦画瓢 
	PPN p = (PPN)malloc(sizeof(Person));
	p->id = 1;	
	p->age = 10;	
	p->price = 22.0F;	
	p->sex = \'1\';	
	printf("person中的id是:%d,age是:%d,price是:%d,sex是:%d\\n",p->id,p->age,p->price,p->sex);
	return 0;
}

查看控制台输出:

Person这种数据结构占的字节是:24
Person这种数据结构占的字节是:24
person中的id是:1,age是:10,price是:0,sex是:49

--------------------------------
Process exited after 0.01804 seconds with return value 0
请按任意键继续. . .
千里之行,始于足下。不积跬步,无以至千里

以上是关于C语言结构体的主要内容,如果未能解决你的问题,请参考以下文章

C 语言关于结构体做参数传递?

求解答c语言结构体定义中typedef的作用

C语言,结构体

C 语言结构体 ( 结构体偏移量计算 | 代码示例 )

C语言结构体,求大佬指点

C语言中结构体在OC中用啥替代