C语言结构体:初学者指南及示例

zhi结构基础知识

结构是一些值的集合,这些值称为成员变量。结构体每个成员都可以是不同类型变量


结构体声明

struct stu{
//member-list;--列表成员

	char name[20];
	short age;
	char tele[12];
	char sex[5];
};a1, a2, a3;//全局创建变量
              //variable-list;--变量列表

struct-结构体关键字   stu-结构体标签   struct stu-结构体类型  {}--member-list:成员列表


typedef关键字

typedef 是一种预处理器指令,用于创建现有数据类型的别名。这使得程序员可以在程序中使用更易于理解和记忆的名字来代替复杂的数据类型声明。

下面代码利用`typedef` 可以为结构体类型定义别名,使代码更清晰

typedef struct stu{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}stu;
int main() {

	struct stu one; //局部创建
	stu s2;

	return 0;
}

       提示:typedef #define 都是 C 语言中的预处理器指令,但它们的作用和用途有所不同。typedef 用于创建新的数据类型别名,而 #define 用于创建符号常量。希望我的解释能帮助您更好地理解和使用这两种指令!


结构体成员类型

  1. 基本类型:这是最常用的类型之一,包括整型、浮点型、字符型等等。
  2. 指针类型:这是指针变量,可以指向另一个变量或其他内存位置。
  3. 数组:这是一种特殊的数据类型,它由一系列具有相同数据类型和长度的元素组成。
  4. 枚举:枚举是一种特殊的整数类型,用于表示一组常量值。
  5. 函数指针:这种类型表示指向某个函数的指针。
  6. 结构体/联合:结构体/联合类型允许您将多种不同的数据类型组合在一起。
  7. void:void 类型通常用于函数声明,表示没有任何返回值。

结构体初始化

int main() {
	struct stu s1 = { "小花",15,"123456789123","女" }; //局部创建
	stu s2 = {"麻麻",20,"123456789123","男"};
	return 0;
}

列表初始化是指通过使用大括号将结构体变量初始化为一个列表,其中列出所有成员变量和其对应值


结构体成员的访问

指针->变量名

struct student {
    char name[50];
    int age;
};

// 使用.
struct student s = {"John", 23};
printf("%s\n", s.name);
printf("%d\n", s.age);

// 使用->
struct student *p = &s;
printf("%s\n", p->name);
printf("%d\n", p->age);
int main() {
	struct stu s1 = { "小花",15,"123456789123","女" }; //局部创建
	stu s2 = {"麻麻",20,"123456789123","男"};
	printf("%s\n",s1.tele);
	printf("%s\n",s2.tele);
	printf("%s\n",s1.sex);
    printf("%s\n",s2.sex);
	return 0;
}

结构标签.变量名

typedef struct stu{
	//成员变量:member-list;列表成员
	char name[20];
	short age;
	char tele[12];
	char sex[5];
	double b;
}stu;//类型
 //variable-list:变量列表
struct str
{
	char name[20];
	struct stu s1;
	char* p;
};
int main() {
	char arr[] = "hello byte";
	struct stu s1 = { "小花",15,"cccc","女" }; //局部创建
	struct  str s3 = { "小明",{"小花",15,"123456789123","女" ,3.1415926},arr}; //局部创建
	stu s2 = {"麻麻",20,"123456789123","男"};

	printf("%s\n",s1.tele);
	printf("%s\n",s2.tele); 
	printf("%s\n",s2.sex);
	printf("%d\n",s3.s1.age);
	printf("%lf\n",s3.s1.b);//浮点
	printf("%s\n",s3.p);//指针--hello byte
	return 0;
}

利用函数输出结构体

//利用函数
typedef struct stu {
	char name[20];
	short age;
	char tele[12];
	char sex[5];
	double b;
}stu;
void prin(stu tmp) {
	printf("name: %s\n",tmp.name );
	printf("age: %d\n", tmp.age);
};
void prin2(stu* p) {//指针接收
	printf("name: %s\n", p->name);
	printf("age: %d\n", p->age);
};
int main() {
	stu s1 = { "小花",15,"123456789123","女" };
//打印结构体数据
	prin(s1);
	prin2(&s1);//传地址
}

prin函数接收一个实参为stu类型的变量,在这个例子中,实参为s1。

prin2函数接收一个实参为stu类型的指针,在这个例子中,实参为&s1。

如果您只想通过函数打印一个结构体变量的信息,那么prin函数就足够了。

然而,如果您想通过函数对结构体进行更复杂的操作(比如修改结构体中的某个元素),那么您可能需要用到指向结构体的指针,这时就需要用到像prin2这样的函数了。


上面的print1和print2函数哪个好些?

答案是:首选print2函数。

原因:
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降
结论:

结构体传参的时候,要传结构体的地址

C语言结构体:初学者指南及示例_第1张图片

栈 :先进后出,后进先出

插入一个元素:压栈   

删除一个元素:出栈


结构体是一种重要的数据结构,它可以将不同类型的数据组合在一起,形成一个单一的复合数据类型。以下是关于结构体的一些重要点:

  1. 定义:在C语言中,结构体是由一组相关联的数据项组成的复合数据类型,每个数据项都有自己的名称和类型。
  2. 声明:要声明一个结构体,可以使用关键字"struct",并在其中列出所有字段及其类型。
  3. 初始化:可以使用"{}"来初始化结构体,为每个字段提供一个初始值。
  4. 访问:可以通过"."或"->"运算符来访问结构体中的字段。
  5. 指针:可以通过指针来引用结构体,这使得在程序中处理大量结构体数据变得更加容易。
  6. 动态内存分配:可以使用malloc()calloc()等函数来动态地分配结构体的内存。
  7. 联合体:联合体是一种特殊类型的结构体,其中的所有字段都共享相同的内存空间。

总之,结构体是C语言中一种非常有用的复合数据类型,可以帮助程序员更加高效地组织和管理数据。

你可能感兴趣的:(数据结构)