基于Hadoop的电商大数据分析及LightFM的隐式推荐算法的设计与实现
C语言结构体的定义和使用
1. 结构体的定义
结构体是用户自定义的复合数据类型,用于将不同类型的数据组合成一个整体。定义语法如下:
c
struct 结构体标签 {
数据类型 成员1;
数据类型 成员2;
// ...
};
示例:定义学生结构体
c
struct Student {
char name[50]; // 姓名
int id; // 学号
float gpa; // 平均绩点
};
2. 声明结构体变量
- 直接声明
c
struct Student stu1; // 声明结构体变量
- 定义时声明
c
struct Point {
int x;
int y;
} p1, p2; // 同时声明p1、p2变量
3. 访问结构体成员
使用`.`运算符访问成员:
c
// 赋值
strcpy(stu1.name, 张三
stu1.id = 20230001;
stu1.gpa = 3.8;
// 读取
printf(: %sn1.name);
printf(号: %dn.id);
4. 结构体指针与`->`运算符
c
struct Student *ptr = &stu1;
ptr->id = 20230002; // 等价于 (*ptr).id
printf(点: %.1fngpa);
5. 结构体初始化
- 顺序初始化
c
struct Student stu2 = {四 20230003, 3.9};
- 指定成员初始化(C99起)
c
struct Student stu3 = {.gpa=4.0, .name=五n
6. 嵌套结构体
c
struct Date {
int year;
int month;
int day;
};
struct Employee {
char name[50];
struct Date birthday; // 嵌套结构体
};
// 使用
struct Employee emp = {六1995, 8, 20}};
printf(年份: %dnirthday.year);
7. 结构体大小与内存对齐
使用`sizeof`获取大小:
c
printf(大小: %zu字节n sizeof(struct Student));
注意:编译器会根据成员类型进行内存对齐,实际大小可能大于成员总大小。
完整示例
c
#include
#include
struct Book {
char title[100];
char author[50];
float price;
};
int main() {
// 声明并初始化
struct Book book1 = {程序设计谭浩强.8};
// 修改成员
struct Book *ptr = &book1;
ptr->price = 55.5;
// 打印信息
printf(: %sn1.title);
printf( %sn.author);
printf(价格: ¥%.1fn book1.price);
return 0;
}
关键点总结
1. 结构体将不同类型数据封装为逻辑单元
2. 使用`.`访问成员,指针使用`->`
3. 支持嵌套定义和初始化
4. 内存布局受对齐规则影响
5. 常用于表示复杂对象(如坐标、学生记录等)
C语言结构体的定义和使用
结构体是C语言中一种自定义复合数据类型,允许将不同类型的数据项组合成一个整体。以下是详细说明:
1. 结构体定义
使用`struct`关键字定义新数据类型:
c
// 定义结构体类型
struct Student {
char name[20]; // 字符串成员
int age; // 整型成员
float gpa; // 浮点型成员
}; // 注意分号结尾
- `struct Student`是类型名
- 大括号`{}`内是成员变量列表
- 每个成员独立声明,支持所有基础数据类型
2. 结构体变量声明
两种声明方式:
c
// 方式1:定义时声明变量
struct Point {
int x;
int y;
} p1; // 直接声明p1
// 方式2:先定义类型,再声明变量
struct Student s1; // 声明Student类型变量s1
3. 成员访问
通过点运算符`.`访问成员:
c
s1.age = 20; // 赋值
printf(PA: %.1f s1.gpa); // 取值
4. 初始化方法
c
// 顺序初始化
struct Student s2 = {, 3.8};
// 指定成员初始化(C99 )
struct Student s3 = {.gpa=4.0, .name=
5. 结构体指针
通过指针访问成员需用`->`运算符:
c
struct Student *ptr = &s1;
ptr->age = 21; // 等价于 (*ptr).age = 21
6. 典型应用场景
c
// 定义坐标结构体
struct Coordinate {
double x;
double y;
};
// 计算两点距离函数
double distance(struct Coordinate a, struct Coordinate b) {
return sqrt( pow(b.xa.x, 2) pow(b.ya.y, 2) );
}
7. 嵌套结构体
c
struct Date {
int year;
int month;
int day;
};
struct Employee {
char name[30];
struct Date hire_date; // 嵌套结构体
};
> 关键点总结
>结构体实现数据封装,增强代码可读性
>内存占用:所有成员内存之和(考虑内存对齐)
>支持数组、指针等复杂类型成员
>通过`typedef`可简化类型名(如`typedef struct Student Student;`)
C语言结构体的定义和使用
在C语言中,结构体(struct)是一种用户自定义的数据类型,它允许你将多个不同类型的数据组合成一个单一的复合类型。结构体常用于表示复杂对象(如学生信息、坐标点等),使代码更模块化和可维护。下面我将逐步解释结构体的定义和使用方法。
1. 结构体的定义
结构体使用`struct`关键字定义,语法格式为:
c
struct 结构体标签 {
数据类型 成员1;
数据类型 成员2;
// 更多成员...
};
- 结构体标签:一个自定义的名称(如 `Student`),用于标识结构体类型。
- 成员列表:包含变量声明(如 `int age; char name[20];`),每个成员可以是基本类型(如 `int`, `float`)或其他结构体。
- 注意:定义结构体时,必须以分号 `;` 结束。
例如,定义一个表示学生信息的结构体:
c
struct Student {
int id; // 学号
char name[50]; // 姓名
float score; // 分数
};
2. 结构体的声明和初始化
定义结构体后,可以声明结构体变量并进行初始化:
- 声明变量:
直接使用 `struct 结构体标签 变量名;`。
或使用 `typedef` 简化(推荐,避免重复写 `struct`):
c
typedef struct Student Student; // 定义别名
Student s1; // 声明变量
- 初始化:
在声明时赋值:使用花括号 `{}` 包裹初始值列表。
示例:
c
struct Student s1 = {101, 张三 85.5}; // 按成员顺序初始化
// 或指定成员初始化(C99及以上支持)
struct Student s2 = {.id = 102, .name = 四score = 90.0};
3. 访问结构体成员
通过点操作符 `.` 访问结构体变量的成员:
c
s1.id = 103; // 修改学号
printf(: %sn1.name); // 访问姓名
如果使用结构体指针,则通过箭头操作符 `->` 访问成员:
c
Student *ptr = &s1; // 声明指针
ptr->score = 95.0; // 修改分数
printf(: %.1fn->score); // 输出分数
4. 结构体的高级用法
- 结构体数组:定义数组存储多个结构体实例。
c
Student class[3]; // 声明结构体数组
class[0] = (Student){201, 王五 88.0}; // 初始化第一个元素
- 嵌套结构体:结构体成员可以是另一个结构体。
c
struct Date {
int year;
int month;
};
struct Employee {
int id;
struct Date hireDate; // 嵌套结构体
};
- 结构体大小:使用 `sizeof` 运算符获取结构体占用内存大小(注意内存对齐问题)。
c
printf( 大小: %zu 字节n(Student));
5. 完整代码示例
下面是一个完整的C程序,演示结构体的定义、初始化、访问和使用:
c
#include
// 定义结构体
typedef struct {
int x;
int y;
} Point; // 表示二维坐标点
int main() {
// 声明和初始化结构体变量
Point p1 = {10, 20};
Point p2 = {.x = 30, .y = 40};
// 访问成员
printf(1 坐标: (%d, %d)n1.x, p1.y);
p1.x = 15; // 修改x坐标
// 使用结构体指针
Point *ptr = &p2;
ptr->y = 50;
printf(p2 坐标: (%d, %d)n->x, ptr->y);
// 结构体数组
Point points[2] = {{1, 2}, {3, 4}};
for (int i = 0; i < 2; i ) {
printf( %d: (%d, %d)n 1, points[i].x, points[i].y);
}
return 0;
}
输出示例:
p1 坐标: (10, 20)
p2 坐标: (30, 50)
点 1: (1, 2)
点 2: (3, 4)
6. 注意事项
- 内存对齐:结构体成员在内存中可能不是连续存储的(因编译器对齐优化),这会影响 `sizeof` 的结果。使用 `#pragma pack` 可以控制对齐方式。
- 赋值操作:结构体变量可以直接赋值(如 `p1 = p2;`),但涉及指针或动态内存时需小心。
- 灵活性:结构体是C语言中构建复杂数据结构的基础,常用于文件I/O、网络通信等场景。
通过以上步骤,你可以轻松定义和使用结构体来组织数据。如果有特定问题(如结构体与联合体的区别),欢迎进一步询问!
C语言结构体的定义和使用
结构体是C语言中一种自定义的复合数据类型,允许将不同类型的数据组合成一个整体。下面详细介绍其定义和使用方法:
---
1. 结构体定义
使用`struct`关键字定义结构体类型:
c
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
// 更多成员...
};
示例:定义学生结构体
c
struct Student {
char name[50]; // 姓名
int age; // 年龄
float gpa; // 平均成绩
};
---
2. 结构体变量声明
- 直接声明
c
struct Student stu1; // 声明一个Student类型的变量
- 定义时声明
c
struct Student {
char name[50];
int age;
} stu2, stu3; // 同时声明变量stu2和stu3
- 使用`typedef`简化
c
typedef struct {
int x;
int y;
} Point; // 定义新类型名Point
Point p1; // 直接声明Point类型变量
---
3. 结构体初始化
- 声明时初始化
c
struct Student stu4 = {, 3.8};
- 逐成员初始化
c
struct Student stu5;
strcpy(stu5.name, 李四n stu5.age = 22;
stu5.gpa = 3.9;
---
4. 访问结构体成员
使用`.`运算符访问成员:
c
printf(: %sn4.name);
stu4.age = 21; // 修改成员值
---
5. 结构体指针
- 指针声明与访问
c
struct Student *ptr = &stu4;
printf(年龄: %dn->age); // 使用->访问成员
ptr->gpa = 4.0; // 修改成员值
- 动态内存分配
c
struct Student *stuPtr = (struct Student*)malloc(sizeof(struct Student));
strcpy(stuPtr->name, 五n free(stuPtr); // 释放内存
---
6. 结构体作为函数参数
- 传值调用(复制整个结构体)
c
void printStudent(struct Student s) {
printf(: %s, 年龄: %dn.name, s.age);
}
- 传址调用(高效,避免复制)
c
void modifyStudent(struct Student *s) {
s->age = 1; // 直接修改原结构体
}
---
7. 嵌套结构体
结构体可以包含其他结构体:
c
struct Date {
int year;
int month;
int day;
};
struct Employee {
char name[50];
struct Date hireDate; // 嵌套结构体
};
struct Employee emp = {赵六2020, 5, 15}};
printf(年份: %dn.hireDate.year);
---
关键注意事项
1. 结构体定义本身不分配内存,声明变量时才分配内存。
2. 结构体大小是所有成员大小之和(考虑内存对齐)。
3. 可用`memcpy(&stu1, &stu2, sizeof(struct Student))`复制结构体。
4. 结构体成员可以是数组、指针甚至其他结构体。
通过结构体,可高效组织复杂数据,是C语言实现面向对象编程的基础。
更多推荐
所有评论(0)