我知道变量的指针。
int x = 10;
int *ptr = &x;
在这些表达中涉及三件事:
x占用2字节的内存bcos是一个整数。
ptr也需要2个字节。
如果x的内存地址为1004,那么ptr将存储1004。
在这些例子中,只要我们在程序中使用* ptr,它就会给我们一个存储在内存中的值addrs - 1004
但结构会发生什么? 举个例子:
struct book {
int a;
int b;
}
struct book str1, str2;
struct book *ptr = &str1;
我对这个例子有三个问题:
1)ptr如何保存str1的完整地址?
2)什么是差异。在变量的指针和内存中完整结构的指针之间?
3)ptr需要多少字节?
4)ptr有成员吗?如果它有成员那么会有什么类型的成员? (指针或变量)还有一件事 - 与类的对象有什么关系呢?
答案 0 :(得分:5)
1)ptr如何保存str1的完整地址?
它包含起始地址。它不需要保持范围或任何东西。
2)内存中ptr的架构如何?
在内部,它是一个32位或64位无符号整数,具体取决于操作系统位宽(解释为指针)。
3)ptr需要多少字节?
4或8字节(对于32位或64位操作系统)。
4)ptr有成员吗?如果它有成员那么什么类型的成员呢 会有吗? (指针或变量)
您可以使用->
运算符取消引用指针,如
int x = ptr->a;
答案 1 :(得分:0)
void*
。以下所有内容都给出了相同的结果:
str1.a = 10;
ptr->a = 10;
(*ptr).a = 10;
答案 2 :(得分:0)
你在这里真正要求的是什么? Ptr将指向内存中str1所在的地址。因此ptr
的值将与&str1
的值相同,但是如果要获取指针的地址(通常是4个字节) - 此处为&ptr
,当然它与ptr
不同。
如前所述,指针通常占用4个字节的内存。
取决于计算机的体系结构,因为它通常是4个字节。
指针不能让成员指针指向具有成员的结构或类。
答案 3 :(得分:0)
指向struct
的指针没什么特别之处。基本上所有指针都只是一个记忆地址。主要是当你的类型重要时你取消引用一个指针,因为如果你有
int a;
int* a_ptr = &a;
然后
*a_prt;
会给你int
,但如果你有
struct foo { void bar(){} };
foo a;
foo* a_ptr;
然后
*a_ptr;
会给你一个foo
。与此相关,请注意
a_ptr->bar();
与
相同(*a_prt).bar();
编译器可以检查foo
是否真的有一个bar()
,如果指针的类型未知,那将是不可能的。{/ p>