结构体本质上就是一种"自定制类型"
#include<stdio.h>
//struct 就是一个关键字
//Student 这是结构体的名字(自己创建的类型的名字)
struct Student{
//{ }里面放置结构体的"成员"
int id;
char name[1024];
};
int main() {
//这个代码就是创建了一个变量,名字叫student
//这个变量的类型就是struct Student
struct Student student = {10,"zhangsan" };//10 对应 id , zhangsan 对应 name
//创建变量 并进行初始化
return 0;
}
当我们创建一个结构体的时候, 结构体里面的"成员"到底要放什么.
创建自定制类型时, 我们是希望通过这个代码,对现实中的问题进行抽象.
抽象和具体之间本质的区别在于"信息量的多少"
抽象的过程 不能脱离实际的问题场景!!
必须要根据实际的场景来决定提取哪些信息到代码中!!
创建结构体变量的时候可以使用{ }语法进行初始化, 但是不能使用{ }进行赋值.
只能针对结构体每个成员进行赋值.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
struct Student{
int id;
char name[1024];
};
int main() {
struct Student student = {10,"zhangsan" };
student.id = 20;//.是成员访问运算,翻译成中文相当于"的"
strcpy(student.name,"lisi"); // string.h
//student.name[0] = 'l';
//student.name[1] = 'i';
//student.name[2] = 's';
//student.name[3] = 'i';
//student.name[4] = '\0';
printf("%d\n",student.id);
printf("%d\n",student.name);
return 0;
}
//除了.之外,还有一种成员访问操作,->
//如果当前的变量是一个结构体指针,使用->来访问成员.
#include<stdio.h>
#include<string.h>
struct Student {
int id;
char name[1024];
};
int main() {
struct Student student = {10,"zhangsan" };
struct Student* p = &student;
printf("%d\n",p->id);
//printf("%d\n",(*p).id);
return 0;
}
结构体作为函数参数
#include<stdio.h>
struct Student{
int id;
char name[1024];
};
void printStudent(struct Student s){
s.id = 20;
printf("%d\n",s.id);
printf("%s\n",s.name);
}
int main(){
struct Student student = { 10, "张三"};
printStudent(student);
printf("%d\n",student.id);
return 0;
}
#include<stdio.h>
struct Student{
int id;
char name[1024];
};
void printStudent(struct Student* s){
s->id = 20;//(*s.id)=20;
printf("%d\n",s->id);
printf("%s\n",s->name);
}
int main(){
struct Student student = { 10, "张三"};
printStudent(&student);
printf("%d\n",student.id);
return 0;
}
在C语言中,如果结构体传参,使用指针类型.
形参是实参的拷贝.
int,double,拷贝开销是非常小的,