所以这里我有一小段代码
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
有人可以解释一下吗?
答案 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