C 结构指针和结构变量的用法有什么区别?

C 结构指针和结构变量的用法有什么区别?,c,structure,C,Structure,在访问结构成员时,我们使用variable.i或ptr->i 我的问题是变量的使用和*ptr想象一只狗有什么区别 现在想象一条狗皮带 现在想象一下那条狗,被拴在皮带上 皮带代表指向狗的指针。如果你创建了一个指针(皮带)并且没有指向(狗)的结构,那么你就不能去公园玩飞盘 如果你有一个结构,但没有指针,你仍然可以做很多事情 使用指针需要有一个指向的结构。您可以声明一个结构,然后使用&操作符指向该结构,或者调用类似malloc或calloc的函数,该函数将返回动态分配的内存,您可以将其用作结构: st

在访问结构成员时,我们使用variable.i或ptr->i 我的问题是变量的使用和*ptr

想象一只狗有什么区别

现在想象一条狗皮带

现在想象一下那条狗,被拴在皮带上

皮带代表指向狗的指针。如果你创建了一个指针(皮带)并且没有指向(狗)的结构,那么你就不能去公园玩飞盘

如果你有一个结构,但没有指针,你仍然可以做很多事情

使用指针需要有一个指向的结构。您可以声明一个结构,然后使用
&
操作符指向该结构,或者调用类似
malloc
calloc
的函数,该函数将返回动态分配的内存,您可以将其用作结构:

struct Book {
    int i;
} variable, *ptr;

变量
将有与其关联的内存,因此在创建时可以直接访问。由于内存是在编译时提供的,
意味着编译器可以直接查找结构中的值,而无需进行任何形式的直接跳转


ptr
将只是一个指向内存的指针,在指向有内存的东西(或通过动态内存分配指定内存)之前不能使用。
->
意味着编译器必须先读取内存,然后跳转到该位置。

ptr
未初始化,因此任何通过它的访问都无法进行(
*
->
)将有UB。这就是你的意思吗?可能是重复的谢谢你的回答。对不起,我没听清楚。你能不能解释清楚一点,如果可能的话。你的地址和你的家之间有一些区别。更具体地说,假设结构很大,比如说,1000字节。一个结构变量分配1000字节的内存。一个指向该结构可能分配4或8个字节(内存地址的大小)。Hmmm-因此可以有1)带狗2)带狗和不带狗(悬挂指针)3)带狗(空指针)或4)不带狗(内存泄漏)。;-):-)太酷了…谢谢你@Austin。。。我得到了it@chux(4)也是小宝贝菲菲,在家里到处乱扔东西。使用结构时不必使用指针。;-)@这些都是聪明的建议。谢谢迈克尔的澄清
void demo() {
    struct Book b1;
    struct Book b2;

    typedef struct Book * Bookptr;

    Bookptr p;

    // Assign pointer to existing object using address operator:

    p = &b1;
    p->i = 10;
    p = &b2;
    p->i = 12;
    printf("Book 1 has i: %d, while Book 2 has i: %d\n", b1.i, b2.i);

    // Use dynamically allocated memory
    p = calloc(1, sizeof(struct Book));
    p->i = 3;
    printf("Dynamic book has i: %d\n", p->i);
    free(p);
}