用C编程语言指针

时间:2014-06-15 11:20:27

标签: c pointers

我需要一些帮助,我在某个脸书页面上看到了以下2个代码。

代码1:

/*this is fyn and will print knowledge*/ ‪ 
#‎include‬<stdio.h>
void choco(char *s)
{
    if(*s=='\0')
    return;
    printf("%c",*s);
    choco(++s);
}
main()
{
    choco("knowledge");
}

代码2:

/*even this is fyn bt it wll print egdelon*/‪
#‎include‬<stdio.h>
void choco(char *s)
{
    if(*s=='\0')
    return;
    choco(++s);
    printf("%c",*s);
}
main()
{
    choco("knowledge");
}

有人可以详细解释两个C代码的输出。我有点困惑。

2 个答案:

答案 0 :(得分:2)

    两个示例中的
  • choco("knowledge");都使用指向字符串 knowledge ,'k'的第一个字符的指针调用chocho函数。以这种方式创建的C-Strings将始终包含尾随字节'0',因此字符串函数确实知道字符串结束的位置。
  • 如果到达字符串的末尾,则
  • if(*s=='\0') return;跳过(0字节,见上文)
  • printf("%c",*s);打印指针s当前指向的字符。 *s*用于从指针中检索实际字符。
  • choco(++s);调用choco,指针s增加1,因此它指向字符串的下一个字符。

使用此信息,第一个代码示例非常简单。调用函数choco并打印第一个字符。然后它使指针指向下一个字符('n')并使用更新的指针调用自身。重复此过程,直到到达字符串(0字节)的末尾。

在第二个代码示例中,函数首先使用下一个字符调用自身,并在返回调用时打印字符。因此,首先打印最后一个字符。

考虑来电choco("abc");

  1. 使用 s 指向 a
  2. 来调用choco
  3. 在choco的第3行,再次调用choco, s 指向 b
  4. 在choco的第3行,再次调用choco, s 指向 c
  5. 在choco的第3行,再次调用choco, s 指向尾随'0'
  6. 由于条件if(*s=='\0')
  7. choco返回
  8. choco执行3.继续输出 c
  9. choco执行2.继续输出 b
  10. choco执行1.继续输出 a
  11. 我在第二个代码示例中添加了一些调试输出:

    #include <stdio.h>
    void choco(char *s){
        printf("choco was called with: %c\n", *s);
        if(*s=='\0'){
            printf("I return\n");
            return;
        }
        choco(s+1);
        printf("output: %c\n",*s);
    }
    int main()
    {
        choco("knowledge");
    }
    

    这是输出的样子:

    choco was called with: k
    choco was called with: n
    choco was called with: o
    choco was called with: w
    choco was called with: l
    choco was called with: e
    choco was called with: d
    choco was called with: g
    choco was called with: e
    choco was called with: 
    I return
    output: e
    output: g
    output: d
    output: e
    output: l
    output: w
    output: o
    output: n
    output: k
    

答案 1 :(得分:0)

让我们用更短的字符串尝试:

void choco(char *s)
{
    if(*s=='\0')
    return;
    choco(++s);
    printf("%c",*s);
}
main()
{
    choco("ab");
}
  1. * s =&#39; a&#39; :  呼叫(++ S)
  2. * s =&#39; b&#39;: 呼叫(++ S)
  3. * s =&#39; \ 0&#39;: 当然回到第2步的结果
  4. 所以print b并返回步骤1的结果

    所以print a

    然后完成

    **编辑**根据您的评论 让我们试试这里:

    choco("ab") :
    
    if('A' = '\0') return;
    choco('B') -----------------> if('B'='\0') return;
                                  choco('\0') -----------------> if('\0'='\0') return;
                                  printf(B)    
    printf(A)