【发布时间】:2015-08-10 01:45:03
【问题描述】:
谁能给我解释一下
- for 循环条件为 *(str+i)
- 循环将执行到什么时候
-
count[i++]和count[i]++有什么区别
void fillCharCounts(char *str, int *count) { int i; for (i = 0; *(str+i); i++) { count[*(str+i)]++; } }
【问题讨论】:
-
添加语言标签。
谁能给我解释一下
count[i++]和count[i]++有什么区别
void fillCharCounts(char *str, int *count)
{
int i;
for (i = 0; *(str+i); i++)
{
count[*(str+i)]++;
}
}
【问题讨论】:
代码计算str 的每个字母的频率并将其存储到整数数组count。该函数执行后,count[index]的频率为str[index]。让我解释一下你想知道的:
条件为 *(str+i) 的 For 循环:
*(str + i)等于str[i],指的是str的第i个字符。字符指针的值递增以访问下一个索引的地址,然后取消引用该地址以获得指针str现在指向的索引值。
循环将执行到什么时候:
对于每个*(str+i),循环将继续,直到在*(str+i) 找到Null Terminator,即假设以下字符串:
char str[] = "abc";
str 中存储的内容现在是 abc\0,因此循环将一直执行,直到到达 \0。条件*(str+i)基本等于*(str+i) != '\0';
count[i++]和count[i]++有什么区别:
count[i++] 等于 *(count + i++) 在使用之前将Post Increment 强加到存储在count 中的address。这意味着一旦执行了语句,(count+i) 的值就会增加 1,并且 count 开始指向下一个索引。count[i]++ 等于*(count + i)++,它将Post Increment 强加到存储在(count + i) 指向的索引中的value。这意味着在执行此语句后,*(count+i) 的值会增加一但计数仍指向当前索引。在你的情况下循环中使用的语句是:
count[*(str+i)]++;
*(str+i),这将给出存储在(str+i)所指向的地址的value
value 将用作计数的index,并且Post Increment 将被强加到count[index],这意味着*(count+index) 的值在执行上述语句后加1。 希望它现在已经很清楚了。
【讨论】:
str = "mom" 让我们访问count[*(str+i)],( ) 将首先被评估,当时 str 是指向"mom" 的第一个索引的指针,因此它持有 m 的地址,对于i = 0,str+i 表示str+0,所以结果值再次是m.* 的地址,它会给出存储在str+i 的值,即m 在我们的案子。请记住,[ ] 运算符只接受整数,因此它将尝试将 convert m 转换为整数,这将导致使用 itsASCII 作为 count 的索引。
此代码 sn-p 计算在str 中找到的每个字符(不包括终止空字符)的出现次数并将它们存储到count。当函数返回时,count 充当字符到外观数量的映射。例如count['a']是指'a'在str中出现的次数。 *(str + i) 等于 str[i],它引用了 C 样式字符串 str 中的 i-th 字符。所以循环一直持续到str 引用的字符串的结尾(即循环到终止空字符'\0',在布尔上下文中计算为false)。 count[*(str+i)]++; 等价于count[str[i]]++;,它将字符str[i] 的计数(出现次数)加一。 count[i++] 和 count[i]++ 的区别与这段代码 sn-p 无关。
【讨论】: