2015-05-29 122 views
1

递归调用我有以下功能是混淆了我

int vowels(char *str) 
{ 
    int count = 0; 
    if (! str[0]) 
     return count; 
    if (strchr("aeiouAEIOU", str[0])) 
     count ++; 
    return count + vowels(&str[1]); 
} 

执行计算所有出现在字符串中的元音,是什么让我困惑的是递归调用元音(&海峡[1])做不明白为什么每次打电话去下一个字符,不要这样做str ++。他们可以帮助我理解这一点?请。

+0

看起来像一个递归练习 – marom

+0

STR应该是const BTW – Axalo

回答

2

在这一声明如下

int vowels(char *str); 

虽然我将宣布它像

size_t vowels(const char *str); 

表达

&str[1] 

每个函数调用相当于

str + 1 

++str 

但是你可能不使用

str++ 

,因为表达式的值是递增之前存储在str地址。

至于我,我会定义函数通过以下方式

size_t vowels(const char *s) 
{ 
    return *s ? (strchr("aeiouAEIOU", *s) != NULL) + vowels(s + 1) : 0; 
} 
+0

我测试++海峡,它的工作原理是 – Kevin

+0

@Tony应该为我的工作在我的帖子中指出:) :) –

+0

@Tony看到我更新的帖子。 –

0

如果下一个元素的地址是&str[1],那么没有理由做str++

2

vowels(&str[1])调用vowels使用&str[0]之后的1个字节的地址,在存储器中开始str。因为strchar *,这意味着它使用字符串减去其第一个字符。

请注意,你不会想要做str++&str++,因为这些会尝试修改str本身,而不是仅仅使用该字符串的一部分。

0

井字符串存储在内存中。这是做什么是将字符的地址传递给函数str的字符指针。所以&str[1]只是数组下一个字符的地址(它只是跳到下一个字节)。