文章主体来源自:C语言结构体与结构体指针的使用
C语言结构体与结构体指针的使用
C语言结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合。说得通俗一点就是一个集合。c语言是一门面向过程的编程语言,而结构体的使用在某些层次上跟面向对象有异曲同工之妙。
一、结构体变量的定义和初始化
1、首先我们来看一下结构体的定义
struct 结构体名
{
成员列表;
};// 结构体的定义
struct Student
{
int num;
char *name;
char *sex;
}
// 与原文区别:原文这里采用的name[20]和sex来直接标识结构。这里采用了指针来标识。注意:这里需要区别一下结构体名和变量名,结构体名是一种类型,不能被当成变量名来使用。
变量名声明方法:
- struct 结构体名 结构体变量名;
- 直接在定义结构体的时候添加变量名的声明。
struct Student st1 = {1001,"kirito","m"};
printf("num:%d, name:%s, sex:%s",st1.num,st1.name,st1.sex); // --> num:1001, name:kirito, sex:mstruct 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、结构体数组的定义及初始化
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写入字符串给指针
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、结构体指针的定义方法
- struct 结构体名 *指针;
- 直接在定义结构体的时候添加结构体指针的声明。
struct Student *stup;struct Student
{
int num;
char *name;
char *sex;
} *stup;2、利用结构体指针的访问结构体变量(输出)
结构体指针的访问变量方法
- p->结构体成员
- (*p).结构体成员
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;
}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;
}练习
- p-> num++
- p++->num
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;
}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