指向结构的指针
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.name 和 ptr->name 具有相同的内存地址并且 b1.author 和 ptr->author 有相同的内存地址
没有
struct b
{
char name[25];
char author[25];
int callno;
}b1,*ptr;
这将创建一个 struct b
类型的对象 b1
和一个指向 struct b
类型的指针 ptr
。 b1
和 ptr
这两个变量互不相关。
不,b1
和ptr
是两个不同的变量,存储在不同的位置。
b1
是类型 struct b
.
的 struct b1
的基地址
ptr
是类型 b
的 pointer 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;
}
好吧,我正在阅读一本 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.name 和 ptr->name 具有相同的内存地址并且 b1.author 和 ptr->author 有相同的内存地址
没有
struct b
{
char name[25];
char author[25];
int callno;
}b1,*ptr;
这将创建一个 struct b
类型的对象 b1
和一个指向 struct b
类型的指针 ptr
。 b1
和 ptr
这两个变量互不相关。
不,b1
和ptr
是两个不同的变量,存储在不同的位置。
b1
是类型 struct b
.
struct b1
的基地址
ptr
是类型 b
的 pointer 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;
}