*(++ p)是什么意思?

时间:2020-06-06 16:43:41

标签: c

我写了以下示例:

#include <stdio.h>
int main()
{
    int p_arr[4]={3,5,6,1}, q_arr[4]={7,2,9,5};
    int *p=p_arr;
    int *q=q_arr;
    int i=1;
   printf("%d\t", *p + *q);  
   printf("%d\t", *(p++) + *(++q));   
   printf("%d\t", *(++p) + *(q++));
   printf("%d\t", *(p+i) + *q+i);
   printf("%d\t", *p+i + *(q+i));
   return 0;
}

为什么第四个输出11和最后一个输出12?

2 个答案:

答案 0 :(得分:1)

C中的指针可以递增或递减。在C语言中,增加指针意味着"make it point to the next element, as if the elements are in a array"

为使其更加清晰,请进行以下设置:

struct s_mystruct
{
    int a;
    double b;
};
struct s_mystruct v[5];
struct s_mystruct *p1 = v;
struct s_mystruct *p2 = v;
struct s_mystruct q1, q2;

那么,确实*p1 == v[0];,即取消引用指针p1与访问向量v的第一个元素相同。

但是由于p1是向量,因此可以递增。事实证明,C有两个指针增量运算符:增量前和增量后。因此,如果:

p1 = v;
p2 = v;
q1 = *(p1++);
q2 = *(++p2);

那么确实是:

q1 == v[0];
q2 == v[1];
p1 == v + 1;
p2 == v + 1;

换句话说,两个语句都增加一个指针的值,最后,该指针将指向下一个元素,但是p++的意思是“使用指针p在增加它之前的值,而++p的意思是“使用指针p递增后将具有的值。

答案 1 :(得分:0)

希望有一点额外的输出将使事情变得不言自明。

int main(void) {
  int p_arr[4] = {3, 5, 6, 1}, q_arr[4] = {7, 2, 9, 5};
  int *p = p_arr;
  int *q = q_arr;
  int i = 1;
  printf("\t");
  printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
  printf("%d\t", *p + *q);
  printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
  printf("%d\t", *(p++) + *(++q));
  printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
  printf("%d\t", *(++p) + *(q++));
  printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
  printf("%d\t", *(p + i) + *q + i);
  printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
  printf("%d\t", *p + i + *(q + i));
  printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
  return 0;
}

输出

    i:1 p:0xffffcaf0,3 q:0xffffcae0,7
10  i:1 p:0xffffcaf0,3 q:0xffffcae0,7
5   i:1 p:0xffffcaf4,5 q:0xffffcae4,2
8   i:1 p:0xffffcaf8,6 q:0xffffcae8,9
11  i:1 p:0xffffcaf8,6 q:0xffffcae8,9
12  i:1 p:0xffffcaf8,6 q:0xffffcae8,9