【问题标题】:How does these Pointer statements differ *p = &i , h = &j?这些指针语句有何不同 *p = &i , h = &j?
【发布时间】:2015-01-09 02:31:18
【问题描述】:

我一直在尝试使用指针,但遇到了这个问题。 在这段代码中.. p,h 是两个指针......我已经等同于 *p = &i , h = &j ;并打印值 我的期望是 *p 将包含地址, p 将具有指向 i 的地址,在 h 的情况下, h 将具有地址, *h 将 o/p 的值 j。

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i =10;
int *p = &i;
int j =30;
int *h;
h = &j;
printf("Hello world!\n %d , %d \n" , *p , p);
printf("Hello world!\n %d , %d \n" , *h , h);
return 20;
}

但是我的o/p在p和i的情况下是相反的..为什么会这样..编译器如何 区分 b/w 这两种语句 .... *p = &i ;和 *p = i;

o/p是这样的

Hello World!
10 , 2359060
Hello World!
30, 2359056

如果问题标题有误,我很抱歉.. 我不知道如何描述这种情况.. 任何类似问题的链接将不胜感激

【问题讨论】:

  • p 不是 int --> printf("%d\n" , p); 不是好的代码。最好使用printf("%p\n" , p);。最好使用printf("%d\n" , (void *) p);
  • 在大多数健全的硬件上没有区别。事实上,在将指针填充到 varargs 之前,将指针投射到 void * 并没有任何作用。您可以争辩说"%p" 以更易读的方式打印它,当然,但教科书警告在现实世界中意义不大。

标签: c pointers addressof


【解决方案1】:

声明

int *p = &i; 

p 声明为指向int 的指针,并用i 的地址对其进行初始化。就像写作一样

int *p;
p = &i;

在这些语句之后,p 包含i 的地址,*p 包含i 的值。 正如 John Kugelman 指出的,使用 %p 格式说明符来打印指针。

【讨论】:

    【解决方案2】:

    此声明

    int *p = &i;
    

    意思是:

    int *p;
    p = &i;
    

    p被定义为一个整型指针(int *),然后赋值&amp;i(整型变量i的地址)。

    *p = &amp;i

    相同

    【讨论】:

      【解决方案3】:

      为减少混淆,您可以使用:

      int* p = &i;
      

      然后,您可以始终记住 p 指的是地址,而 *p 指的是值

      【讨论】:

        【解决方案4】:

        我高度接受第二个定义,因为它是定义指针​​的正确方法。你看,你应该定义标题,并且 然后为其分配要指向的变量,不带*

        【讨论】:

          【解决方案5】:

          如果i 是一个持有10 的变量,并且你将p 定义为一个持有i 地址的int *,那么你的语句意味着:

          printf("Hello world!\n %d , %d \n" , 
              *p ,    // value inside p, ie value of i, 10
              p);     // value OF p, which is the address of i
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-05
            • 2021-02-28
            • 1970-01-01
            • 2013-03-01
            • 2021-09-20
            • 2013-07-05
            相关资源
            最近更新 更多