以下C程序的输出是什么?

时间:2012-08-24 10:19:14

标签: c pointers

我不知道编译器使用++*p;

做了什么

有人能用图解方式向我解释这段代码内存中发生了什么吗?

int main()
{
    int arr[]={1,2,3,4};
    int *p;
    p=arr;
    ++*p;
    printf("%d",*p);
}

6 个答案:

答案 0 :(得分:2)

答案应为2

原因是++ * p实际上是将数组中的第一个成员递增1。

答案 1 :(得分:2)

您正在通过创建指向该元素的另一个int指针p来递增该数组中的第一个元素。这条线

 ++*p

增加p指向的对象的值 - 在这种情况下,它是数组中的第一个元素。

答案 2 :(得分:1)

让我们走这条路:

++*p

这将首先取消引用p指针,因此访问arr [0],然后递增它。

如果你现在打印arr [0],它将是2。

然后打印* p与打印arr [0]相同,它等于2.

尝试将第一个元素替换为41,您的代码将打印42。

答案 3 :(得分:1)

当你有一个指针int *p时,p表示“内存地址p指向,*p表示”内存地址的内容{{1}指向“。p表示预增量,这意味着将值增加1.由于++*(前缀运算符)等一元运算符的关联性是正确的 - 向左移动,++在从右向左移动时距*更接近p++*之前运行。因此{{1} }表示“递增++指向的值”,而不是“递增++*p然后获取值”。写p更清楚,但它意味着同样的事情。

要理解的是“增加指针”之间的区别,这意味着指向另一个值(例如p)和“增加指针指向的值”(例如++(*p)

你可以解决这个问题,但这是了解它所需要的所有信息。

答案 4 :(得分:1)

组成实际的内存地址并使用“ma”作为内存地址

在从1000开始的内存地址处,我们有4个连续的4字节(sizeof(int)= 4)个插槽。   每个槽包含数组初始化程序中给出的整数值:

  arr
  ma1000 ... ma1015
  _____________________
  |   1|   2|   3|   4|   
  _____________________

arr给出4个int插槽的起始地址和有多少个。   p保存整数的地址并引用内存中的一个8字节插槽(假设我们位于 64位系统,其中指针是8个字节 - 64个地址位/ 8位/字节)在2000年。   在语句p = arr之后,p保存地址1000

  p                     *p or arr[0]
  ma2000 .. ma2007      ma1000 .. ma1003
  __________            ________
  |    1000|            |    1 |
  __________            ________

* p给出p指向的内存地址的值。 p保存存储器地址1000,存储器地址1000包含1,因此* p结果为1。

++ * p表示用p增加int“指向”的值。 p保存存储器地址1000,其保存值1.地址1000处的值然后从1变为2

 arr
 ma1000 ... ma1015
 _____________________
 |   2|   2|   3|   4|   
 _____________________

printf然后在p的地址“指向”处输出int值,即2。

  p                     *p or arr[0]

  ma2000 .. ma2007       ma1000 .. ma1003
  ___________           ___________
  |     1000|           |        2|
  ___________           ___________

答案 5 :(得分:0)

这是理解指针的一个非常基本的概念。

p = arr ;

上面的代码将使指针“p”指向“arr”指向的内容。 “arr”本身指的是第一个元素。

*arr = *(arr + 0) = arr[0] = 1
*(arr + 1) = arr[1] = 2
*(arr + 2) = arr[2] = 3

依旧...... 所以当你做++(*arr) that means ++(1) = 2

作为p = arr,您可以进行剩余的替换和数学运算。

相关问题