指向结构的指针是如何工作的?

时间:2016-06-17 17:11:50

标签: c++ structure

我知道变量的指针。

int  x = 10;
int *ptr = &x;

在这些表达中涉及三件事:

  1. x占用2字节的内存bcos是一个整数。

  2. ptr也需要2个字节。

  3. 如果x的内存地址为1004,那么ptr将存储1004。

  4. 在这些例子中,只要我们在程序中使用* 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有成员吗?如果它有成员那么会有什么类型的成员? (指针或变量)

    还有一件事 - 与类的对象有什么关系呢?

4 个答案:

答案 0 :(得分:5)

  

1)ptr如何保存str1的完整地址?

它包含起始地址。它不需要保持范围或任何东西。

  

2)内存中ptr的架构如何?

在内部,它是一个32位或64位无符号整数,具体取决于操作系统位宽(解释为指针)。

  

3)ptr需要多少字节?

4或8字节(对于32位或64位操作系统)。

  4)ptr有成员吗?如果它有成员那么什么类型的成员呢   会有吗? (指针或变量)

您可以使用->运算符取消引用指针,如

int x = ptr->a;

答案 1 :(得分:0)

  1. 它包含指向结构的指针。它也恰好是指向第一个元素的指针,如果你将它转换为int。
  2. 指针在物理上是相同的,无论它们的类型如何,超出了语言给出的语义(你可以使用强制转换来违反)。指针基本上只是一个数字,表示存储数据的长线性内存集中的位置。
  3. 与任何其他指针相同 - 但 因系统而异。 32或64位,4/8字节,通常。它的大小为void*
  4. 指针没有成员。指针只是一个指针。但是,您可以遍历指向具有成员的结构的指针。
  5. 以下所有内容都给出了相同的结果:

    str1.a = 10;
    ptr->a = 10;
    (*ptr).a = 10;
    

答案 2 :(得分:0)

  1. 你在这里真正要求的是什么? Ptr将指向内存中str1所在的地址。因此ptr的值将与&str1的值相同,但是如果要获取指针的地址(通常是4个字节) - 此处为&ptr,当然它与ptr不同。

  2. 如前所述,指针通常占用4个字节的内存。

  3. 取决于计算机的体系结构,因为它通常是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>