精通C语言结构体与指针:实战指南
精通C语言结构体与指针:实战指南
探索如何利用指针操作结构体成员,并学习动态内存分配以构建灵活的C数据结构。
深入结构体指针前,请熟悉以下基础主题:
使用指针引用结构体
下例展示如何声明结构体和引用它的指针。
struct Person {
int member1;
int member2;
/* 更多成员 */
};
int main(void) {
struct Person *ptr, harry;
/* ptr 可指向任意 Person 实例 */
}
此处 ptr 是指向 struct Person 实例的指针。
示例:通过指针访问结构体成员
通过指针读写结构体字段,使用 -> 运算符。
#include <stdio.h>
struct Person {
int age;
float weight;
};
int main(void) {
struct Person *personPtr, person1;
personPtr = &person1; /* 指向 person1 */
printf("输入年龄: ");
scanf("%d", &personPtr->age);
printf("输入体重: ");
scanf("%f", &personPtr->weight);
printf("\n显示:\n");
printf("Age: %d\n", personPtr->age);
printf("Weight: %f", personPtr->weight);
return 0;
}
personPtr = &person1; 将 person1 地址存入 personPtr。随后用 personPtr->field 访问等价于 (*personPtr).field,语法更简洁。
personPtr->age等同于(*personPtr).agepersonPtr->weight等同于(*personPtr).weight
结构体动态内存分配
编译时未知实例数量时,使用C标准库在运行时分配内存。
示例:分配结构体数组
#include <stdio.h>
#include <stdlib.h>
struct Person {
int age;
float weight;
char name[30];
};
int main(void) {
struct Person *ptr;
int i, n;
printf("输入人数: ");
scanf("%d", &n);
ptr = (struct Person*)malloc(n * sizeof(struct Person));
if (!ptr) {
fprintf(stderr, "内存分配失败\n");
return EXIT_FAILURE;
}
for (i = 0; i < n; ++i) {
printf("依次输入姓名和年龄: ");
scanf("%s %d", (ptr + i)->name, &(ptr + i)->age);
}
printf("\n显示信息:\n");
for (i = 0; i < n; ++i) {
printf("Name: %s\tAge: %d\n", (ptr + i)->name, (ptr + i)->age);
}
free(ptr);
return 0;
}
运行结果:
输入人数: 2 依次输入姓名和年龄: Harry 24 依次输入姓名和年龄: Gary 32 显示信息: Name: Harry Age: 24 Name: Gary Age: 32
演示如何在堆上创建 n 个 struct Person 实例,读取用户输入并显示。
C语言