C函数参数作为指针

时间:2017-06-25 02:40:08

标签: c pointers post-increment

20
30
40
50

编译代码后,结果如下:

11
21
31
41

但是,根据我的理解,输出应为:

{{1}}

我很困惑。任何人都可以帮我理解这个吗?

4 个答案:

答案 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个条目,但你显然知道这一点。)