【问题标题】:Why two different variables have the same address but different value in the below code? [closed]为什么在下面的代码中两个不同的变量具有相同的地址但不同的值? [关闭]
【发布时间】:2021-07-06 12:58:43
【问题描述】:

检查ap[1]的值和地址:

#include<stdio.h>

 main()
{
    int a=10,*p,c=20,n,i;
    printf("---&a is %p\n",&a);
    printf("---&p is %p\n",&p);
    printf("---&c is %p\n",&c);
    printf("---a is %d\n",a);
    printf("---p is %d\n",p);
    printf("---c is %d\n",c);

    printf("Enter size: ");
    scanf("%d",&n);
    printf("Enter ele: ");
    for(i=0;i<n;i++)
    {
        scanf("%d",&p[i]);
    }

    printf("---&p[1] is &p\n",&p[1]);
    printf("---&p+1 is &p\n",&p+1);
    printf("---a is &d\n",a);
    printf("---p[1] is &d\n",&p[1]);
    printf("---p+1 is &p\n",&p+1);  
    printf("---a is &p\n",a);
    printf("---&a is &p\n",&a);
    printf("---c4 is &p\n",c);
    printf("---&c is &p\n",&c);
}

这里ap[1]的值不同,虽然地址相同,为什么?

【问题讨论】:

  • 您似乎没有为p赋值。
  • p 未初始化。所以&amp;p[1] 是一个不确定的值。总之,代码无效。
  • 代码无效!!首先,我打印了垃圾值,然后我使用 scanf 来分配值!!
  • p 未初始化,因此它不指向任何对象。这使得&amp;p[i] 的使用无效。如果p 的值是一个足够大的内存区域的地址,可以存储10 个int 值,那就没问题了。但它没有赋值,更不用说对象的地址了。
  • 这与声明未初始化的int 然后尝试在算术表达式中使用它没有什么不同。 (int base; for (i = 0; i &lt; 10; ++i) printf("%d\n", base + i);)。

标签: c pointers memory-address


【解决方案1】:

p[1] 是(根据定义)*(p + 1)p + 1 &amp;p + 1 相同,因为&amp;p 是变量p 的地址,而p 是该地址处的内存内容。

您的代码也存在许多问题。

事实证明,&amp;p + 1 是合法且定义明确的,尽管您不能取消引用它(也就是说,您不能使用 *(&amp;p +1)。)地址是有效的,因为指针算法允许您将非数组变量视为尽管它们是长度为 1 的数组,但对于任何数组,您都可以计算超出数组末尾的第一个元素的地址。不允许取消引用过去的地址,但可以将该地址与指向实际数组元素的指针进行比较。)

你也不能计算*(p+1),因为p没有被初始化,所以你不能给它加1,你也不能使用未初始化的值作为指针。 (它没有指向任何东西。)

【讨论】:

  • 先生,但在 scanf 中这是有效的,对吗? (p[i])。 p+i 与 p[i] 相同,并且 i 没有使用 *(p+1)。请再看看。此外,写成 &p+1 表示 &(p+1) 但我们不能使用括号。据我所知,&p[i] 和 &p+i 是相同且有效的。指针 p 有一些地址,+1 表示将值存储在 p 的下一个地址中。我的意思是如果 p 的地址是 1000,那么 p+1 的地址就是 1002,依此类推。那么,问题出在哪里?如果我错了,请向我解释。我有疑问,请帮助我!
  • @zeel:几乎所有这些都是错误的。 (1) 如果pint*,则p[i] 作为scanf 参数无效。您需要使用&amp;p[i]p+i。 (2)p+ip[i]不同。与&amp;p[i] 相同。 (3) &amp;p+1(&amp;p)+1。就像任何其他前缀运算符一样。 (4) &amp;(p+1) 无效,因为不能取临时值的地址。 (5) 你需要了解地址和值的区别。如果pint 并且它的值为42,那么p+1 就是43,不管p 的地址是什么。 “p+1的地址”没有意义,因为临时值没有存储在任何地方。
  • @zeel:请记住值和地址是不同的东西。即使一个变量是一个指针(int *p),它也有一个地址和一个值(存储在那个地址)。 &amp; 表示“地址”。 *p 表示“地址为p 值的对象”。 p[i]*(p+i) 完全相同;那就是它的定义。所以&amp;p[i]&amp;(*(p+i)),也就是p+i。 (看看&amp;*的定义就明白为什么&amp;*xx对于任何指针值x:地址是x的值的对象的地址。
  • 实际上,当我写p[i] 时,我的意思是&amp;p[i]。如果我在&amp;p+1 中存储一个值,它会与&amp;p[i] 相同吗?如果是,请检查我的代码并运行它!回复我
  • @zeel:不。我已经说过好几次了,我不想重复自己。来自之前的评论; “(2)p+ip[i]不同,与&amp;p[i]相同。”来自答案:“p + 1&amp;p + 1 不同,因为&amp;p 是变量p 的地址,而p 是该地址处的内存内容。”
猜你喜欢
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
相关资源
最近更新 更多