定义结构体
从某种程度上来说,会不会用 struct,怎样用 struct 是区别一个开发人员是否具备
丰富开发经历的标志 !
#include <stdio.h>
#include <stdlib.h>
/*
怎么区别自定义的struct,所以要加类名
定义了一个数据类型 固定大小内存块的别名 还没有分配内存
*/
// 自定义类 有名结构体 Desk
struct Desk // 类名
{
float length;
float width;
float high;
char mer;
float price;
};
// 自定义类 有名结构体 Person
struct Person
{
float high;
int weight;
char sex;
int age;
float score[4];
};
// 无名结构体City
struct
{
char *name;
char *areaCode;
} city; //定义了变量city
/**
1 有名结构体一次定义 多处使用,会带来新的命名
2 无名结构体 定义类型的同时定义变量, 无名结构体不引入新的类型
这两种方式 用的是偏少一些 多的还是别名结构体
*/
// 别名结构体
typedef struct Student
{
char name[100];
char sex;
int age;
}STU;
int main() {
// 自定义的类型
struct Desk d; // 定义了变量 d
struct Person p; //定义了变量 p
printf("%p", &p);
d.length = 10; //成员访问
city.name = "ShangHai";
printf("city.name = %s\n", city.name); //city.name = ShangHai
STU s1;
s1.age = 10;
printf("s1.age=%d\n", s1.age);
// 凡是基本类型 既可定义时初始化 也可以先定义 再赋值
// 凡是构造类型 要么在定义时初始化, 不可以,先定义 再以初始化的方式初始化
STU s2 = { "tom", 'x', 18 }; //初始化 注意 构造类型只能在定义时就要初始化
printf("s2.name=%s\n", s2.name); // s2.name=tom
STU s3;
strcpy(s3.name, "hello");
// s3.name = "Hello"; name是数组的首地址 数组赋值需要下标才可以
printf("s3.name=%s\n", s3.name); //s3.name=hello
//以上都是成员式 下面演示指向式
STU *ps = &s3; //指针初始化
strcpy(ps->name, "World");
ps->age = 20;
printf("ps.name=%s\n", ps->name);
printf("ps.age=%d\n", ps->age);
system("pause");
return;
}
结构体元素做函数参数pk结构指针做函数参数
define _CRT_SECURE_NO_WARNINGS
include
include
include
/**
定义一个结构体类型
定义了一个数据类型。固定大小内存块的别名 还没有分配内存
类型的重定义 **/
//用类型定义变量的方法3种 typedef struct Teacher { char name[64]; int age; int id; }Teacher;
//2 struct Student { char name[64]; int age; }s1, s2; // 定义类型的同时 D
//3 struct { char name[64]; int age; int id; }s3, s4; // 匿名类型 定义变量
//初始化变量的三种方法 2 struct Student2 { char name[64]; int age; }s5 = { “aaa”,10 };
//初始化变量的三种方法 3 struct { char name[64]; int age; }s6 = { “aaa”,10 };
void struct1() {
//初始化变量的三种方法
//struct Teacher t1;//告诉C编译器给我配分内存
Teacher t1;//告诉C编译器给我配分内存 前面已经用typedef重定义了 所以struct可以去掉
Teacher t2 = { "aaaa", 30, 01 };
t1.age = 12; // t1. 操作符是干什么 有没有操作内存 -> 是寻址操作 计算 age 相对于 t1大变量的 偏移量 ===》计算 cpu中进行 没有操作操作内存
//通过指针操作的方式 操作 内存空间
{
Teacher *p = NULL;
p = &t2;
printf("p->age:%d\n", p->age); // 是寻址操作 计算 cpu中进行 没有操作操作内存
}
strcpy(t1.name, "t1name");
printf("t1.name:%s \n", t1.name);
return;
}
void copyTeacher(Teacher to, Teacher from) { to = from; // 这里不会改变实参 }
void copyTeacher2(Teacher to, Teacher from) { to = from; }
void main() {
// struct1();
Teacher t3 = { "Hello",18,22 };
Teacher t4;
Teacher t5;
Teacher t6;
memset(&t5, 0, sizeof(t5));
t4 = t3;
printf("t4.name:%s \n", t4.name); // hello
printf("t4.age:%d \n", t4.age); // 18
printf("copyTeacher()\n\n");
copyTeacher(t5, t3); // 形参不会改变实参
printf("t5.name:%s \n", t5.name); // ''
printf("t5.age:%d \n", t5.age); // 0
printf("copyTeacher2()\n\n");
copyTeacher2(&t6, &t3); // 形参会改变实参
printf("t6.name:%s \n", t6.name); // hello
printf("t6.age:%d \n", t6.age); // 18
system("pause");
return;
}