指向结构的指针

Pointers to structure

好吧,我正在阅读一本 C 书 Let us C,并且正在根据书中的图表表示阅读指向结构的指针,结构的指针指向结构的开头,例如

strcut b
{ 
    char name[25];
    char author[25];
    int callno;
}b1,*ptr;



b1.name      b1.author  b1.callno   
::::::::::::::::::::::::::::::::::::::::::::
: Let Us c    :  YPK       : 101           :    
::::::::::::::::::::::::::::::::::::::::::::
4001        4026        4051




   ptr
::::::::::
: 4001   :  
::::::::::
   8000

以上是内存表示,其中4001,8000等是内存地址。现在如果默认情况下 ptr 指向 4001,那么不应该 b1.nameptr->name 具有相同的内存地址并且 b1.authorptr->author 有相同的内存地址

没有

struct b
{ 
    char name[25];
    char author[25];
    int callno;
}b1,*ptr;

这将创建一个 struct b 类型的对象 b1 和一个指向 struct b 类型的指针 ptrb1ptr 这两个变量互不相关。

不,b1ptr是两个不同的变量,存储在不同的位置。

b1 是类型 struct b.

struct b1 的基地址

ptr 是类型 bpointer to a structure

现在如果你写:ptr = &b1;

然后ptr保存b1的地址。

现在,再见取消引用 ptr 您可以访问 b1 的成员。

这条记录

strcut b
{ 
    char name[25];
    char author[25];
    int callno;
}b1,*ptr;

等同于

strcut b
{ 
    char name[25];
    char author[25];
    int callno;
};

struct b b1;
struct b *ptr;

如您所见,如果这些定义定义了局部变量,则变量 ptr 未被初始化。如果他们用静态存储持续时间定义变量(全局变量),那么 ptr 将被初始化为 NULL。

Shouldn't then b1.name and ptr->name have the same memory address and also b1.author and b1->ptr have the same memory address

如果原来的定义这样写的话,它们的地址是一样的

strcut b
{ 
    char name[25];
    char author[25];
    int callno;
}b1,*ptr = &b1

也就是说如果ptr是由b1的地址初始化的。

b1.name 和 ptr -> 名称具有相同的地址。
Similary b1.author 和 ptr -> author 有相同的地址。

下面的程序可以用来演示这个概念;

#include<stdio.h>
#include<stdlib.h>

struct b
{
        char name[25];
        char author[25];
        int callno;
}b1, *ptr;

int main()
{


    ptr = &b1;

    printf("%p %p\n", (void *)b1.name, (void *)ptr->name);
        printf("%p %p\n", (void *)b1.author, (void *)ptr -> author);
    printf("%p %p\n", (void *)&(b1.callno), (void *)&(ptr -> callno));  
    return 0;
}