C 指针反引用

C 指针反引用,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[*

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)]++;
       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
      指向
      int
      s的数组)。另见下文
    • count[*(str+i)]++
      计算为数组中
      count
      指向的
      *(str+i)
      索引处的
      int
      。作为一个副作用,它会在表达式的值确定后将该数组元素增加1。这个整体表达式出现在您的代码中只是因为它的副作用
    需要注意的是,尽管数组
    count
    中为256个不同的
    char
    值的外观计数保留了空间,但您询问的表达式并不是一种安全的方法来对所有值进行计数。这是因为type
    char
    可以作为有符号类型来实现(由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