初识结构体1
Posted 两片空白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识结构体1相关的知识,希望对你有一定的参考价值。
1.结构体声明与定义
- 为什么有结构体
计算机是为了解决人生活上的问题,当生活中需要记录一个人的信息时,需要记录这个人的不同类型的信息。比如名字,年龄,住址,电话等等。这是就形成了结构体。
结构体是一些相同或者不同类型变量的集合,这些变量称为成员变量。
结构体成员可以是常量,数组,指针,或者其它结构体。
- 结构体的声明
一般形式:
struct 结构体名{
结构体成员
};
此时的 struct 结构体名 (可自己定义) 相当于 结构体类型。例如整形类型 int,字符类型 char等。
当结构体类型过长时,一般可以用typedef 进行类型重命名。
- 结构体定义
例如定义一个学生信息的结构体。
struct student{
char name[16];
int age;
char telphone[16];
};
//typedef对结构体类型重命名
typedef struct student{
char name[16];
int age;
char telphone[16];
}stu_s;//stu_s 相当于struct student结构体类型
- 结构体初始化
利用上面定义的学生结构体信息。
struct student t = { "Tom", 19, "13677777777" };
stu_s j = { "Jim", 18, "17699999999" };//typedef重定义后可以这样使用
此时定义了两个结构体变量 t和j。
注意:结构体变量可以整体初始化,不可以整体赋值。
stu_s j ;
j = { "Jim", 18, "17699999999" };//错误
2.结构体成员的访问
结构体访问可以通过两种方式访问。
- 利用结构体直接用‘.’点操作符访问。
例如:
#include<stdio.h>
struct student{
char name[16];
int age;
char telphone[16];
};
int main(){
struct student t = { "Tom", 19, "13677777777" };
t.age = 20;
strcpy(t.name, "Jim");
printf("%s\\n", t.name);
printf("%d\\n", t.age);
return 0;
}
输出:
这样就实现了访问结构体成员name和age,并且实现了对这两个成员赋值。注意,由于name是字符串,不能直接对其赋值,要使用函数strcpy();
- 当一个结构体指针变量指向一个相同结构体类型的结构体时,可以通过‘->’指向操作符访问结构体成员。
#include<stdio.h>
struct student{
char name[16];
int age;
char telphone[16];
};
int main(){
struct student t = { "Tom", 19, "13677777777" };
struct student *p = &t;
printf("%s\\n", p->name);
printf("%d\\n", p->age);
printf("%s\\n", (*p).name);
printf("%d\\n", (*p).age);
return 0;
}
输出:
这里*p就是t,此时也可以使用‘.’点操作符访问结构体成员。
3.结构体传参
调用函数时要在栈中开辟空间形成栈帧,当结构体进行传参,如果结构体过大时,会导致函数在栈中开辟空间过大,导致开销过大,性能下降。
所以,当结构体传参时,要传结构体的地址,用指针进行接收。
#include<stdio.h>
struct student{
char name[16];
int age;
char telphone[16];
};
void print(struct student *p){
printf("%s\\n", p->name);
}
int main(){
struct student t = { "Tom", 19, "13677777777" };
print(&t);
return 0;
}
输出:
PS:
#include<stdio.h>
struct student{
char name[16];
int age;
char telphone[16];
};
int main(){
struct student t = { "Tom", 19, "13677777777" };
struct student *p = &t;
printf("%p\\n", &t);
printf("%p\\n", t.name);
printf("%p\\n", p);
return 0;
}
输出:
结论:结构体地址与第一个结构体成员地址相同。
以上是关于初识结构体1的主要内容,如果未能解决你的问题,请参考以下文章