Java里的对象对应C里的是结构体 关键字struct
定义结构体
// 方式一
struct Dog {
// Java类里有成员,
// 成员
char name[10]; // 这个需要copy
int age;
char sex;
};
// 方式二
struct Person {
char *name; // 这个可能直接赋值
int age;
char sex;
} ppp0,
ppp = {"Derry", 33,'M'},
ppp2 = {"Derry2", 323, 'M'};
int main () {
// 结构体使用
struct Dog dog; // 这样写完,成员是没有初始化,成员默认值为系统值 这跟Java是不一样的
// 方式一赋值
strcpy(dog.name, "暗战风云");
dog.age = 3;
dog.sex = 'G';
// 方式二赋值
ppp0.name = "Printf";
ppp0.age = 22;
ppp0.sex = 'M';
return 0;
}
结构体嵌套结构体,相当于Java类嵌套类
struct Study {
char *studyContent; // 学习内容
};
struct Student {
char name[10];
int age;
char sex;
struct Study study;
struct Play {
char *playContent;
} wan;
};
int main () {
// 创建赋值
struct Student student =
{"李元霸", 88, 'G',
{"学习C"},
{"王者荣耀"}
};
printf("name :%s, age: %d, sex:%c, study:%s, wan:%s\n", student.name, student.age, student.sex,
student.study.studyContent, student.wan.playContent);
}
return 0;
结构体指针
struct Cat {
char name[10];
int age;
};
int main () {
// 先定义一个结构体
struct Cat cat = {"小花猫", 12};
// 定义结构体指针 下面方式静态开辟 在栈区
// VS写法, Cat * catp = &cat;
struct Cat *cat_p = &cat; // Clion写法
// 使用结构 体指针来改值
cat_p->age = 3; // -> 这个符号是调用一级指针成员
// 动态开辟 堆区
// VS写法 : Cat * cat2 = (Cat *)malloc(sizeof(Cat);
struct Cat *cat2 = malloc(sizeof(struct Cat));// 差别是Clion需要加struct
// 赋值
strcpy(cat2->name, "小花猫堆区");
cat2->age = 15;
printf("Cat2 name: %s, age: %d\n", cat2->name, cat2->age);
// 堆区记得释放
free(cat2);
cat2 = NULL;
return 0;
}
结构体数组
定义结构体数据跟常规数组一样
struct Cat3 {
char name[10];
int age;
};
int main () {
// 栈区, 静态开辟
struct Cat3 cat[10] = {
{"1111", 1},
{"222", 2},
{"333", 3},
{"444", 4},
// 为数组的第9个赋值
// cat[9 ] = {"9999", 1} VS写法, 下面是clion写法
struct Cat3 cat9 = {"9999", 9};
cat[9] = cat9;
// 还有一种写法
*(cat + 9) = cat9; // cat[9] = cat9; ===*(cat + 9) = cat9; 二个一样
printf("Cat9 name: %s, age: %d\n", cat9.name, cat9.age);
// 动态开辟 堆区
struct Cat3 *cat2 = malloc(sizeof(struct Cat3) * 10);
// 赋值 指针默认指向首元素地址
strcpy(cat2->name, "小花猫");
cat2->age = 123;
printf("小花猫 name: %s, age: %d\n", cat2->name, cat2->age);
free(cat2);
cat2 = NULL;
return 0;
}