指针解引用

时间:2015-09-30 16:11:26

标签: c pointers

#include<stdlib.h>
#include<stdio.h>
#define NO_OF_CHARS 256

/* Returns an array of size 256 containg count
   of characters in the passed char array */
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;
}

/* The function returns index of first non-repeating
   character in a string. If all characters are repeating 
   then returns -1 */
int firstNonRepeating(char *str)
{
  int *count = getCharCountArray(str);
  int index = -1, i;

  for (i = 0; *(str+i);  i++)
  {
    if (count[*(str+i)] == 1)
    {
      index = i;
      break;
    }   
  }  

  free(count); // To avoid memory leak
  return index;
}

/* Driver program to test above function */
int main()
{
  char str[] = "geeksforgeeks";
  int index =  firstNonRepeating(str);
  if (index == -1)  
    printf("Either all characters are repeating or string is empty");
  else
   printf("First non-repeating character is %c", str[index]);
  getchar();
  return 0;
}

我真的无法掌握以下几点:

count[*(str+i)]++;

amd

  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;
    }

该程序用于查找字符串中的第一个非重复字符。

5 个答案:

答案 0 :(得分:1)

*(str+i)str[i]相同。这一行:

for (i = 0; *(str+i);  i++)

与:

相同
for (i = 0; str[i];  i++)

只要str[i]求值为非零,就会执行循环中的语句。由于C字符串是由空字符终止的字符数组,因此将for中的每个字符执行str循环。它会在到达字符串末尾时停止。

  count[*(str+i)]++;

与:

相同
  count[str[i]]++;

如果str[i]'a',此行将增加count['a']的值,即ASCII编码中的count[97]

在循环结束时,count将填充整数,这些整数表示特定字符​​在str中出现的次数。

答案 1 :(得分:0)

此代码相当于您发布的混乱循环。这有帮助吗?

*(str + i)令人困惑的表达方式str[i]和IMO不合适。

for (i = 0; str[i] != '\0'; ++i)
{
  char curr_char = str[i];
  ++count[curr_char];
}

答案 2 :(得分:0)

在for循环中,我们需要考虑三件事:

  • for loop

  • 的说明
  • 计数器变量的初始化(例如,我的)。 2)条件(*(str + i))3)递增/递减部分(i ++)。

  • 执行for循环直到条件为真(即任何非零值)。所以*(str + i)提供非零值,直到数组中有任何字符..

    count[*(str+i)]++;  // it is counting the number of characters in the array by incrementing the string character by character.
    

答案 3 :(得分:0)

  

我真的无法掌握以下几点:

count[*(str+i)]++;

从外部工作:

  • 由于strchar的指针而iintstr + i是指向char的指针istr本身指向
  • 之后的{1}}字符
  • *(str+i)取消引用指针str+i,意味着它计算指针所指向的char。这完全等同于str[i]
  • count[*(str+i)]使用字符串char中索引i的{​​{1}}作为动态数组str的索引。表达式指定该索引处的count(因为int指向count s的数组。另见下文。
  • int评估数组count[*(str+i)]++中索引为int的{​​{1}}。作为副作用,它在确定表达式的值之后将该数组元素递增1。这个整体表达式专门针对其副作用出现在您的代码中。

值得注意的是,尽管数组*(str+i)中保留了空格来计算256个不同count值的外观,但您询问的表达式并不是一种安全的方法来计算所有它们。这是因为类型count可以实现为签名类型(由C实施者自行决定),并且通常以这种方式实现它。在这种情况下,只有非负char值对应于数组元素,如果输入字符串包含其他元素,则会产生未定义的行为。更安全的是:

char

即。除了将输入字符串的每个字符显式地转换为 unsigned 8位值之外,与原始字符相同。

总的来说,该函数只创建一个256 char s的数组,每个可能的#include <stdint.h> # ... count[(uint8_t) *(str+i)]++; 一个,并扫描字符串以计算每个int值的出现次数出现在其中。然后它返回这个出现计数数组。

答案 4 :(得分:0)

count[*(str+i)]++ =>count[*(str+i)]=count[*(str+i)]+1

现在考虑一个场景:

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

和其他角色一样。 因此count[*(str+i)]++将更新已更新的count中的charcarter的出现次数。