You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中结构体指针指向的地址是什么?附实验疑问

C结构体地址实验的困惑与解析

最近在捣鼓C语言结构体的时候,跟着教程跑示例代码,突然好奇想打印几个地址看看——结构体指针ptr的地址、结构体成员book.title和book.author的地址,结果输出的内容让我有点懵,毕竟之前看到说结构体是一组物理上连续存储的相关数据,但实际地址表现好像有点“反直觉”?

先贴一下我跑的实验代码:

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

struct Book {
    char title[50];
    char author[50];
    int book_id;
};

int main() {
    struct Book book;
    struct Book *ptr = &book;

    // 填充结构体数据
    strcpy(book.title, "C Programming");
    strcpy(book.author, "TutorialsPoint");
    book.book_id = 12345;

    // 打印各类地址
    printf("结构体指针 ptr 自身的地址:%p\n", &ptr);
    printf("结构体 book 的起始地址:%p\n", &book);
    printf("成员 book.title 的地址:%p\n", &book.title);
    printf("成员 book.author 的地址:%p\n", &book.author);

    return 0;
}

运行后我满脑子问号:

  • 结构体指针ptr的地址怎么和book的地址完全不沾边?
  • book.title的地址居然和book的起始地址一模一样?

后来琢磨半天才搞明白,是我把两个概念搞混了:

  • ptr是一个指针变量,它自己也占用内存空间(通常4或8字节,取决于系统位数),&ptr打印的是这个指针变量本身在内存里的位置;而ptr里面存储的才是book的地址,要是把代码里的&ptr改成ptr,输出就会和&book完全一致。
  • 结构体的第一个成员起始地址必然和结构体本身的起始地址相同,因为结构体是连续存储的,第一个成员就从结构体的内存起始点开始放,这完全符合“物理上连续”的定义。
  • 至于book.author的地址,因为title是50字节的char数组,所以它的起始地址就是title的地址加50——这里因为都是char类型,没有内存对齐的填充,刚好无缝衔接,完美体现了连续存储的特性。

想通这些之后,之前的困惑瞬间就解开了,果然还是得动手跑代码、看细节才能把知识点吃透。

内容的提问来源于stack exchange,提问作者Xichu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:51:18