Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 需要澄清指针在给定代码段中的工作方式吗_C_Pointers - Fatal编程技术网

C 需要澄清指针在给定代码段中的工作方式吗

C 需要澄清指针在给定代码段中的工作方式吗,c,pointers,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 有人能解释一下吗?int*ptr=p正在声明一个名为ptr的指针,并将ptr的值设置为p的值。现在两者

这里我有一小段代码

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

有人能解释一下吗?

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

更好的书写方式是int*ptr=p;这更清楚地表明,ptr是一个指针,您正在声明,而不是取消引用。

int *ptr = p;
…是变量ptr的声明,带有初始化

其中的=不是赋值运算符,而是初始化语法的一部分,而*不是ptr的解引用,而是ptr类型规范的一部分

通过以下方式格式化声明,您可以更容易地看到这一点:

int* ptr = p;
原始形式反映了这样一个事实,即C声明语法旨在模仿您声明的任何内容的使用。由于声明故意看起来像用法,初学者很自然会感到困惑。语法被描述为一个失败的实验,既有C的原创创作者,也有C++的创建者。 为了更好地控制C声明语法,您可以定义

template< class T >
using type = T;
…和大括号统一初始化语法

int* ptr( p );
int* ptr{ p };

浏览您的陈述和逻辑:

如果我们说*ptr=p,那么*ptr的地址值为p

这是正确的

p指向a的地址

这是正确的

a的地址包含10个

实际上,变量“a”中存储了10的值

当你写作时:

printf("%u \n",*ptr);
“ptr”前面的星号实际上是一元运算符,它取消了对变量“ptr”的引用。因此,代码所做的是,它转到ptr指向的地址,然后在该地址获得指针类型的值。在本例中,由于它是由int*定义的指针,因此返回int。这个值是10

见:

int*ptr=p;你认为这实际上是做什么的,它的目的是什么?!?int*ptr=p;这就像说int*ptr;ptr=p;int*ptr=p是什么;变量p的声明?@NicolasMiari:谢谢,修正了。
int* ptr( p );
int* ptr{ p };
printf("%u \n",*ptr);