【问题标题】:How does the expression *++ptr is different from ++*ptr? [duplicate]表达式 *++ptr 与 ++*ptr 有何不同? [复制]
【发布时间】:2022-01-19 12:58:14
【问题描述】:

有人可以解释为什么在输出中打印3 4 4 而不是4 4 4

#include <stdio.h>

int main(){

    int a[] ={0,1,2,3,4};
    int *p[] = {a,a+1,a+2,a+3,a+4};
    int **ptr= p; 

    ptr++;
    printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
    *ptr++;
    printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
    *++ptr;
    printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
    ++*ptr;
    printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);

    return 0;
}

【问题讨论】:

  • 你是在增加ptr,还是它指向什么?
  • 请复制粘贴文字不要使用图片

标签: c pointers increment dereference pointer-arithmetic


【解决方案1】:

对于初学者,请注意两个指针的差异具有ptrdiff_t 类型。您不能将转换说明符 %d 用于此类型的对象。你必须使用%td。比如

printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);

表达式 *++ptr 与 ++*ptr 有何不同?

这个表达式

*++ptr

等价于

*( ++ptr )

首先,指针递增并指向数组的下一个元素,然后取消引用,提供指向元素的左值。

这个表达式

++*ptr

相当于

++( *ptr )

首先取消引用指针,为指向的元素提供一个左值,然后增加元素本身。

至于显示的代码

   int a[] ={0,1,2,3,4};
   int *p[] = {a,a+1,a+2,a+3,a+4};
   int **ptr= p; 

   ptr++;
   printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
   *ptr++;
   printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
   *++ptr;
   printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);
   ++*ptr;
   printf("%d %d %d\n",ptr-p,*ptr-a,**ptr);

那么最初的指针ptr指向数组p的第一个元素。

   int **ptr= p; 

然后指针递增

   ptr++;

现在它指向数组p的第二个元素。

结果这个表达式

ptr-p

产生两个指针 ptrp 之间的元素数(在此表达式中,数组指示符转换为指向其第一个元素的指针)等于 1

由于ptr指向数组p的值为a + 1的元素,则表达式

*ptr-a

还产生值1。和表达式

**ptr

产生表达式a[1]的值。

这个表达式语句

*ptr++;

其实等价于

ptr++;

因为指针的解引用没有副作用。

现在指针指向数组p 的第三个元素。而这句话

 printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);

输出

2 2 2

再次声明

   *++ptr;

等价于语句

   ++ptr;

因为取消引用没有副作用。现在指针指向数组p的第四个元素。

还有这句话

   printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);

输出

3 3 3

在此声明中

   ++*ptr;

指针ptr 指向的数组p(第四个元素)的元素增加了。也就是数组的第四个元素现在等于a+4

所以数组 p 现在看起来像

int *p[] = { a, a + 1, a + 2, a + 4, a + 4 };

所以这个说法

   printf("%td %td %d\n",ptr-p,*ptr-a,**ptr);

输出

3 4 4

【讨论】:

  • 感谢您对编写自定义答案的热情,但必须为此提供一个副本。 ;-) 对不起。
猜你喜欢
  • 2021-04-06
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2021-06-25
相关资源
最近更新 更多