C语言申明结构体的几种方式 最后更新时间:2023年11月04日 **文章主体来源自:**[C语言结构体与结构体指针的使用](http://t.csdnimg.cn/CIAP8) ### C语言结构体与结构体指针的使用 C语言结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。说得通俗一点就是一个集合。c语言是一门面向过程的编程语言,而结构体的使用在某些层次上跟面向对象有异曲同工之妙。 #### 一、结构体变量的定义和初始化 ##### 1、首先我们来看一下结构体的定义 ```c struct 结构体名 { 成员列表; }; ``` ```c // 结构体的定义 struct Student { int num; char *name; char *sex; } // 与原文区别:原文这里采用的name[20]和sex来直接标识结构。这里采用了指针来标识。 ``` **注意:这里需要区别一下结构体名和变量名,结构体名是一种类型,不能被当成变量名来使用。** **变量名声明方法:** 1. struct 结构体名 结构体变量名; 2. 直接在定义结构体的时候添加变量名的声明。 ```c struct Student st1 = {1001,"kirito","m"}; printf("num:%d, name:%s, sex:%s",st1.num,st1.name,st1.sex); // --> num:1001, name:kirito, sex:m ``` ```c struct Student { int num; char *name; char *sex; }st1 = { 1001,"kirito","m" }; int mian(){ printf("num:%d, name:%s, sex:%s",st1.num,st1.name,st1.sex); // --> num:1001, name:kirito, sex:m return 0; } ``` ##### 2、结构体数组的定义及初始化 ```c struct Student { int num; char name[20]; char sex[2]; }; // 与原文区别:由于C语言并不会自动分配空间,所以在自动初始化的时候,为了方便,没有采用指针的方式,而是采用了固定空间的数组的方式来处理。 int main() { struct Student stuarr[3]; // 定义结构体数组 // 循环初始化 int num; for (num = 0; num < 3; num++) { scanf("%d %s %s", &stuarr[num].num, stuarr[num].name, stuarr[num].sex); } // 输出 for (num = 0; num < 3; num++) { printf("num:%d, name:%s, sex:%s\n", stuarr[num].num, stuarr[num].name, stuarr[num].sex); // --> } return 0; } ``` **注意:**以下内容节选自[scanf写入字符串给指针](https://blog.csdn.net/Napoleon1130/article/details/115091946) ``` C语言是比较低级的语言,没有字符串概念,只有字符数组,不能自动分配空间,要存放数据,必须预先定义存储空间的大小! 改为:char name[100]; 一定要常量 scanf("%d%s",&a[i].nu,a[i].name); 就没问题了! 估计你曾经看过这种定义法:char *name=“abcd”;这种也是字符数组初始化固定的空间4个,所以你要记住,初始化一定要预定存放的空间大小! 还有你想达到高级语言的效果,你也可以用 a[i].name = (char *)malloc(100); /这里也要常量/ scanf("%d%s",&a[i].nu,a[i].name); 就没问题了! ``` #### 二、结构体指针的使用 ##### 1、结构体指针的定义方法 1. struct 结构体名 *指针; 1. 直接在定义结构体的时候添加结构体指针的声明。 ```c struct Student *stup; ``` ```c struct Student { int num; char *name; char *sex; } *stup; ``` ##### 2、利用结构体指针的访问结构体变量(输出) **结构体指针的访问变量方法** 1. p->结构体成员 2. (*p).结构体成员 ```c struct Student { int num; char *name; char *sex; }; int main() { // 指针访问 struct Student st1 = {1001, "kirito", "m"}; struct Student *stup; stup = &st1; printf("num:%d, name:%s, sex:%s\n", stup->num, stup->name, stup->sex); // --> num:1001, name:kirito, sex:m return 0; } ``` ```c struct Student { int num; char *name; char *sex; }; int main() { // 指针访问 struct Student st1 = {1001, "kirito", "m"}; struct Student *stup; stup = &st1; printf("num:%d, name:%s, sex:%s\n", (*stup).num, (*stup).name, (*stup).sex); // --> num:1001, name:kirito, sex:m return 0; } ``` ##### 练习 1. p-> num++ 2. p++->num ```c struct Student { int num; char *name; char *sex; }; int main() { // 指针访问 struct Student st1 = {1001, "kirito", "m"}; struct Student *stup; stup = &st1; int num = stup->num++; printf("tmpnum:%d, num:%d, name:%s, sex:%s\n",num , stup->num, stup->name, stup->sex); // -> tmpnum:1001, num:1002, name:kirito, sex:m return 0; } ``` ```c struct Student { int num; char *name; char *sex; }; int main() { // 指针访问 struct Student st1[2] = {1001, "kirito", "m",1003,"asna","l"}; struct Student *stup; stup = st1; int num = stup++->num; printf("tmpnum:%d, num:%d, name:%s, sex:%s\n",num , stup->num, stup->name, stup->sex); // -> tmpnum:1001, num:1003, name:asna, sex:l return 0; } ```
Comments | NOTHING