我写了以下示例:
#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?
答案 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