C 指针反引用
amdC 指针反引用,c,pointers,C,Pointers,amd 该程序用于查找字符串中的第一个非重复字符 此代码相当于您发布的混乱循环。有帮助吗 *(str+i)是表达str[i]的令人困惑的方式,我不适合在这里使用 int *getCharCountArray(char *str) { int *count = (int *)calloc(sizeof(int), NO_OF_CHARS); int i; for (i = 0; *(str+i); i++) count[*
该程序用于查找字符串中的第一个非重复字符 此代码相当于您发布的混乱循环。有帮助吗
*(str+i)
是表达str[i]
的令人困惑的方式,我不适合在这里使用
int *getCharCountArray(char *str)
{
int *count = (int *)calloc(sizeof(int), NO_OF_CHARS);
int i;
for (i = 0; *(str+i); i++)
count[*(str+i)]++;
return count;
}
for循环有三件事需要考虑:
- 循环的说明
- 计数器变量的初始化(例如中的i)。2) 条件(*(str+i))3)递增/递减部分(i++)
- 执行for循环直到条件为真(即任何非零值)。所以*(str+i)提供了一个非零值,直到数组中有任何字符
for (i = 0; str[i] != '\0'; ++i) { char curr_char = str[i]; ++count[curr_char]; }
*(str+i)
与str[i]
相同。该行:
count[*(str+i)]++; // it is counting the number of characters in the array by incrementing the string character by character.
同:
for (i = 0; *(str+i); i++)
count[*(str+i)]++;
只要str[i]
的计算结果为非零,循环中的语句就会执行。由于C字符串是以空字符结尾的字符数组,因此将对str
中的每个字符执行for
循环。当到达字符串末尾时,它将停止
for (i = 0; str[i]; i++)
同:
for (i = 0; *(str+i); i++)
count[*(str+i)]++;
如果str[i]
是'a'
,此行将增加count['a']
的值,即ASCII编码中的count[97]
循环结束时,count
将用整数填充,这些整数表示特定字符在str
中出现的次数
我真的不能理解以下几句话:
count[str[i]]++;
从外到内的工作:
- 由于
是指向str
的指针,char
是i
,int
是指向str+i
的指针,也就是char
字符之后的i
本身指向str
取消引用指针*(str+i)
,这意味着它将计算为指针指向的str+i
。这完全等同于char
str[i]
使用字符串count[*(str+i)]
中索引str
处的i
作为动态数组char
的索引。表达式指定该索引处的count
(因为int
指向count
s的数组)。另见下文int
计算为数组中count[*(str+i)]++
指向的count
索引处的*(str+i)
。作为一个副作用,它会在表达式的值确定后将该数组元素增加1。这个整体表达式出现在您的代码中只是因为它的副作用int
count
中为256个不同的char
值的外观计数保留了空间,但您询问的表达式并不是一种安全的方法来对所有值进行计数。这是因为typechar
可以作为有符号类型来实现(由C实现者自行决定),并且这种实现方式很常见。在这种情况下,只有非负的char
值对应于数组元素,如果输入字符串包含其他值,则会产生未定义的行为。更安全的做法是:
count[*(str+i)]++;
#包括
# ...
计数[(uint8_t)*(str+i)]+;
i、 e.与原始字符串相同,只是将输入字符串的每个字符显式转换为无符号8位值
总的来说,该函数只需创建一个由256个int
s组成的数组,每个可能的char
值对应一个数组,并扫描字符串以计算其中出现的每个char
值的出现次数。然后,它返回这个事件计数数组
#include <stdint.h>
# ...
count[(uint8_t) *(str+i)]++;
现在考虑一个场景:
count[*(str+i)]++ =>count[*(str+i)]=count[*(str+i)]+1
所以
和其他角色一样。
因此,
count[*(str+i)]++
将在更新后的count
中更新charcarter的occrance,您到底想做什么?该行计算在给定字符串中找到相同字符的次数。@Gangadhar我知道它做什么,但如何做?这是我的问题。如果你可以简化它。@HellHammer只是为了记录,有什么理由使用calloc而不是malloc吗?我的意思是除零之外初始化缓冲区?解决了我的问题。只是没打中我!str[i]
与*(str+i)
相同的后果之一是str[i]
也与i[str]
相同。
char str[] = "aaab";
*(str+i)/str[i] Will show char like 'a','b'...etc.
count[*(str+i)]++=count['a']++ Mean;
count['a']=count['a']+1 // Will store iteration of a=1
count['a']=count['a']+1 // Will Update iteration of a=2
count['a']=count['a']+1 // Will Update iteration of a=3