C语言结构体指针引用详解

闻溪
闻溪
发布时间:2026-10-16| 4人浏览过
原创

C语言结构体指针是内存管理的关键技术。本文涵盖指向结构体变量的成员访问(含 >> 运算符优先级)、指向结构体数组的循环遍历(含指针移动与 p[i] 等价原理),助开发者掌握高效的结构体数据处理方法。

第一步:理解结构体类型与指针匹配

结构体指针必须定义为其所指向的结构体类型。若需指向 struct STUDENT 类型的变量,指针应定义为 struct STUDENT*。这种严格匹配确保了指针运算(如加1)时能正确跨越整个结构体的内存大小,而不仅仅是单个字节或基本数据类型的大小。

第二步:使用指针访问结构体变量成员

当指针 p 指向某个结构体变量(如 &student1)时,有以下几种引用其内部成员的方式:

第1步:基础语法 (*pointer).member

这是最直观的解引用方式。由于成员运算符 . 的优先级高于指针运算符 *,括号 () 不可省略。如果写成 *p.name,编译器会先执行 p.name(这在指针语境下无意义),导致编译错误。正确写法为 (*p).name。

#include <stdio.h>
#include <string.h>

struct AGE {
    int year;
    int month;
    int day;
};

struct STUDENT {
    char name[20];
    int num;
    struct AGE birthday;
    float score;
};

int main() {
    struct STUDENT student1;
    struct STUDENT *p = NULL;
    
    // 初始化指针
    p = &student1;
    
    // 通过 (*p) 访问成员
    strcpy((*p).name, "小明");
    (*p).birthday.year = 1989;
    (*p).birthday.month = 3;
    (*p).birthday.day = 29;
    (*p).num = 1207041;
    (*p).score = 100;

    printf("name : %s\n", (*p).name);
    return 0;
}

第2步:常用语法 pointer->member

为了书写便捷且符合直觉,C语言引入了 -> 运算符(结构体指针成员访问符)。ptr->name 完全等价于 (*ptr).name。-> 的优先级同样高于解引用操作,但它只适用于指针变量本身,不能用于非指针的成员对象。

// 使用 -> 替代 (*p)
strcpy(p->name, "小明");
p->birthday.year = 1989;
p->birthday.month = 3;
p->birthday.day = 29;
p->num = 1207041;
p->score = 100;

printf("name : %s\n", p->name);
return 0;

注意事项:虽然在赋值操作中,p (类型为 struct STUDENT*) 和 (*p).name (类型为 char*) 在数值上都指向首地址,但由于类型不同,不能直接混用。例如不能用 strcpy(p, "..."),因为 p 不是字符指针。此外,&student1 也不能直接赋给其他类型的指针而不进行强制类型转换,尽管它们在地址值上相同。

第三步:利用指针遍历结构体数组

结构体数组的首地址可以直接赋给同类型的结构体指针。此时,指针像普通数组指针一样,可以通过加法运算移动到下一个元素。

第1步:指针递增与条件判断

假设数组名为 stu,则 stu+1 指向数组第二个元素。指针 p 在 for 循环中自增(++p),即可依次访问每个结构体实例。

#include <stdio.h>

struct STU {
    char name[20];
    int age;
    char sex;
    char num[20];
};

int main() {
    struct STU stu[3] = {
        {"小红", 22, 'F', "Z1207031"}, 
        {"小明", 21, 'M', "Z1207035"}, 
        {"小七", 23, 'F', "Z1207022"}
    };
    
    struct STU *p = stu; // p 指向 stu[0]
    
    for (; p < stu + 3; ++p) {
        printf("name:%s; age:%d; sex:%c; num:%s\n", 
               p->name, p->age, p->sex, p->num);
    }
    return 0;
}

第2步:p[i] 等价性验证

根据 C 语言标准,a[i] 等价于 *((a) + i)。对于结构体指针数组,p[i] 实际上访问的是以 p 为首地址的第 i 个结构体变量。因此,可以使用下标法配合 . 运算符来读取数据,这在逻辑上与直接修改数组名或指针偏移效果一致。

    struct STU *p = stu;
    int i = 0;
    for (; i < 3; ++i) {
        // p[i] 是第 i 个结构体变量
        printf("name:%s; age:%d; sex:%c; num:%s\n", 
               p[i].name, p[i].age, p[i].sex, p[i].num);
    }

总结

处理C语言结构体时,推荐优先使用 pointer->member 格式,代码更简洁易读。在处理动态数据结构(如链表)时,这一习惯至关重要。同时,牢记 *p. 中括号的必要性,能有效避免常见的优先级错误。以上就是C语言结构体指针引用的详细内容,更多关于C语言指针操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。