需要澄清指针如何在给定的代码中工作

时间:2014-11-06 02:38:39

标签: c pointers

所以这里我有一小段代码

int main(){
    int a = 10;
    void *p = &a;
    int *ptr = p;
    printf("%u \n",*ptr);
    return 0;
}

产生结果10!

我真的很困惑。

如果我们说*ptr = p,则*ptr的地址值为p。 而p指向a的地址,而a的地址包含10。 我不知道我们如何从*ptr

获得10分

有人可以解释一下吗?

3 个答案:

答案 0 :(得分:1)

int *ptr = p声明一个名为ptr的指针,并将ptr的值设置为p的值。两者现在都包含a的地址。取消引用后,它们会将值存储在a

写作的更好方式(imo)是int* ptr = p;这使得ptr更明确是指针,并且您正在声明,而不是解除引用。

答案 1 :(得分:1)

该行

int *ptr = p;

...是变量ptr的声明,带有初始化。

=中没有赋值运算符,但是初始化语法的一部分,而*不是ptr的解引用,而是ptr的类型规范的一部分{1}}。

通过这种方式格式化声明,您可以更轻松地看到:

int* ptr = p;

原始表单反映了这样一个事实,即C声明语法旨在模仿您声明的任何内容的使用。由于声明故意看起来像使用,初学者很容易混淆。语法被C的原始创建者和C ++的创建者描述为失败的实验。


要更多地控制C声明语法,您可以定义

template< class T >
using type = T;

...然后声明例如。

type<int*> ptr = p;

或者您可以更具体地命名该类型构建器,例如

template< class T >
ptr_to = T*;

...并写下

ptr_to<int> ptr = p;

替代方案包括使用直接初始化语法

int* ptr( p );

...和花括号统一初始化语法,

int* ptr{ p };

答案 2 :(得分:0)

完成你的陈述和逻辑:

  

如果我们说* ptr = p,则* ptr的地址值为p。

这是正确的。

  

虽然p指向a的地址,

这是正确的。

  

和地址包含10。

实际上,变量'a'的值存储在其中。

当你写:

printf("%u \n",*ptr);

'ptr'前面的星号实际上是一个取消引用变量'ptr'的一元操作符。那么代码所做的是它转到ptr指向的地址,然后在该地址获得指针类型的值。在这种情况下,由于它是由int *定义的指针,因此返回int。那个值是10。

请参阅: Dereference operator