20
30
40
50
编译代码后,结果如下:
11
21
31
41
但是,根据我的理解,输出应为:
{{1}}
我很困惑。任何人都可以帮我理解这个吗?
答案 0 :(得分:3)
在第一遍中,您将指向pskills[0]
的指针传递给fun
(将10
递增到11
),但在ptr
之前增加printf
{1}},因此您打印pskills[1]
(20
)。
简而言之,您过早增加了ptr
。你想要
fun(ptr);
printf("%d\n", *ptr);
++ptr;
或
fun(ptr);
printf("%d\n", *(ptr++));
答案 1 :(得分:2)
更改以下行:
fun(ptr++);
printf ("%d\n", *ptr);
要:
fun(ptr);
printf ("%d\n", *ptr++);
您现在看到的是后期增量操作ptr++
的效果。与指针关联的值会更新,但在您看到打印的更改之前会发生增量。
我还应该提到你的数组大小为5,但是你的循环只运行了4次迭代......但是如果它是这样的话,那就好了。但是,@ DavidC.Rankin在评论中提出的更好的循环方法是尽可能不对任何值进行硬编码。
例如,要在首次声明数组后获取数组的长度,可以使用
int n = sizeof pskills / sizeof *pskills;
然后使用n
逐步完成循环:
for(i = 0 ; i < n ; i++) {
...
}
答案 2 :(得分:2)
让我们理解您的代码位。
fun(ptr++); // Post increment first assigns value then increments.
因此,*i
会收到pskills[0]
的地址,其价值为10
,并按预期将其递增至11
。
现在是你感到困惑的部分。
printf ("%d\n", *(ptr) );
在执行上述行之前,ptr
现在开始指向pskilss[1]
,因为您在ptr
上使用了后增量运算符。记得我在post增量中说,赋值是在increment之前完成的。所以在调用返回之后,增量就完成了。这就是为什么它打印20
而不是11
。同样适用于所有其他值。
现在,如果您需要打印11 21 31 41
,可以通过多种方式进行打印。
好吧,我在这里讨论一个而不会改变你的代码。 只需用下面的语句替换你的printf语句,你就可以了。
printf ("%d\n", *(ptr-1) ) ;
现在,我添加了一点-1
只是为了解释你没有得到预期输出的原因,即仅仅因为增量运算符。 -1
这里取消了增量运算符的效果。
答案 3 :(得分:0)
在打印内容fun(ptr++);
之前,您正在增加指针。
你想增加内容,然后打印,然后增加指针。
#include <stdio.h>
void fun(int *i)
{
(*i) = (*i) + 1;
}
int main(void)
{
int pskills[] = { 10, 20, 30, 40, 50 };
int i, *ptr ;
ptr = pskills;
for ( i = 0 ; i <4 ; i++ )
{
fun(ptr); // first increase content, without increasing the pointer
printf ("%d\n", *ptr ) ; // then print content, before increasing
ptr++; // THEN increase the pointer
}
return 0;
}
输出:
11
21
31
41
宾果!根据需要。
(我注意到你只期望4个值,这与你的循环相匹配。数组有5个条目,但你显然知道这一点。)