C语言指针与结构体:内存地址、访问与操作详解

周末不加班
周末不加班
发布时间:2026-10-16 | 2人浏览过
原创

C语言的指针与结构体是核心数据类型。理解内存地址分配是掌握指针的前提,而结构体则用于将不同类型的数据组合。本文将演示如何通过取址运算符获取变量地址,定义整型指针并进行解引用修改值,同时展示学生信息结构体的创建及通过 . 和 -> 操作符访问成员的具体实现。

理解指针与内存基础

第1步:了解内存单元与地址分配

内存是程序运行的关键存储器。为了有效管理,系统将内存划分为大小为1字节的小单元,并为每个单元分配唯一编号,即内存地址。这使得CPU可以通过地址精确访问数据。

第2步:获取变量的内存地址

当在内存中创建变量时,编译器会分配空间,该空间也有对应的地址。在C语言中,可以使用取址运算符 & 来提取变量的起始地址。对于多字节的变量(如 int 占4字节),系统通常返回占用空间最小的那个字节的地址(低地址)。打印地址建议使用格式控制符 %p,以符合平台相关的地址格式。

#include <stdio.h>

int main()
{
    int num = 10;
    // 取出num的地址
    &num;
    
    // 使用%p打印地址
    printf("%p\n", &num);
    return 0;
}

第3步:定义与使用指针变量

指针变量是一种专门用来存放其他变量地址的变量。定义时需明确指针指向的数据类型,这决定了进行解引用操作时对数据的解释方式。

#include<stdio.h>

int main()
{
    int num = 10;
    // 定义一个指向int类型的指针变量 p
    // * 表示 p 是一个指针,int 表示其指向的数据类型
    int* p;
    
    // 将 num 的地址赋值给 p
    p = &num;
    
    return 0;
}

在实际使用中,我们可以通过指针修改变量的值:*p 称为解引用操作符。执行 *p = 20 时,程序会定位到 p 中存储的地址,并将该位置的数据由 10 修改为 20。

#include <stdio.h>

int main()
{
    int num = 10;
    int* p = &num;
    
    // 通过指针间接修改数值
    *p = 20;
    printf("%d\n", num); // 输出结果为 20
    return 0;
}

第4步:确定指针变量的大小

指针的大小取决于目标平台的架构。在32位系统上,地址总线宽度通常为32位,指针大小为4字节;在64位系统上,指针大小则为8字节。以下代码可用于验证不同数据类型的指针所占空间:

#include <stdio.h>

int main()
{
    // %zu 用于打印无符号整型的大小
    printf("%zu\n", sizeof(char*));
    printf("%zu\n", sizeof(short*));
    printf("%zu\n", sizeof(int*));
    printf("%zu\n", sizeof(double*));
    return 0;
}

结构体的定义与操作

第1步:构建包含多种数据类型的结构体

结构体(struct)允许程序员将不同类型的相关数据组合成一个整体。C语言使用 struct 关键字定义这种自定义类型。定义时需列出所有成员及其数据类型,并用花括号括起来。

假设需要记录学生的详细信息,可以按如下方式定义结构体模板:

struct Stu
{
    char name[20];  // 名字
    int age;        // 年龄
    char sex[5];    // 性别
    char id[15];    // 学号
};

第2步:初始化与成员访问

定义结构体变量后,可以通过两种方式访问其内部成员:

  1. 点操作符 (.):直接用于结构体变量。
  2. 箭头操作符 (->) :仅用于结构体指针,它代表“先解引用再取值”的组合操作。
#include<stdio.h>

int main()
{
    // 定义并初始化结构体变量 s
    struct Stu s = { "张三", 18, "nan", "220210101" };
    
    // 1. 使用点操作符访问变量成员
    printf("%s\t%d\t%s\t%s\n", s.name, s.age, s.sex, s.id);
    
    // 2. 使用箭头操作符访问指针成员
    struct Stu* ps = &s;  // 获取 s 的地址赋给指针 ps
    printf("%s\t%d\t%s\t%s\n", ps->name, ps->age, ps->sex, ps->id);
    
    return 0;
}

注意事项:箭头操作符 -> 只能在已经拥有结构体指针的情况下使用,不能直接用于普通的结构体变量对象。

以上就是C语言指针与结构体的详细内容,更多关于C语言指针与结构体的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表