首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指向指针的指针与指针

指向指针的指针与指针
EN

Stack Overflow用户
提问于 2013-04-13 00:03:04
回答 4查看 241关注 0票数 5

我正在试验双指针(指向指针的指针),并希望正确地理解它。我正在试用下面的代码

代码语言:javascript
复制
#include<stdio.h>

int main()
{
    int y = 5;
    int *p = &y;
    int *q = &p;

    printf("\n\n %p %p %p %p %d\n\n",q,&p,p,*q,*p);

    return 0;

 }

在上面的代码中,p是指向y的指针,q是指向p的指针。我故意不使用双指针(**q),只是为了检查发生了什么。编译器给了我一个警告,指出指针类型不兼容。当我执行代码时,我知道q是一个指向p的指针,所以它包含p的地址,但*q没有给我p中包含的值,也就是y的地址,而是我得到了一些无用的值。是不是因为我没有声明Q为双指针?有人能解释一下为什么我会得到一些奇怪的*q值吗?

EN

回答 4

Stack Overflow用户

发布于 2013-04-13 00:06:19

我得到了一些垃圾价值。是不是因为我没有声明Q为双指针?

本质上是这样的:由于您将q声明为指向int的指针,因此取消引用操作*q认为该地址是一个int。当该int作为指针发送给%p时,您会遇到未定义的行为。请注意,即使在指针的表示与int的表示完全相同的平台上,该行为也将保持未定义状态。这就是未定义行为的背信弃义的本质:有时它是“错误地”工作的。

票数 3
EN

Stack Overflow用户

发布于 2013-04-13 00:06:28

在本例中,p是一个指向整数的指针,这意味着&p是指向一个指向整数的指针的指针。因此,应该将q声明为int**

从我下面的评论...您错误地声明了q ...因此,*q是一个整数,而不是一个指针,您正在向printf()传递一个整数,它将在其中查找内存地址……在那之后几乎所有的东西都是未定义的行为。

票数 1
EN

Stack Overflow用户

发布于 2013-04-13 00:06:39

这一行不正确

代码语言:javascript
复制
 int *q = &p;

&p是指向int (y)的指针(p)的地址

将其赋值给指向int (q)的指针将进行重新解释

*q会将p的地址解释为整数。这与y (=5)的内容不同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15975980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档