1. K&R array example

Hi,

I have been attempting to understand the array example in K&R2, shown below, but I'm not familiar with the line
Code:
` ++ndigit[c-'0'];`
I can see on running it that it increments the next element of the array when there is a non digit then a digit, but how does this for loop do this?

Code:
```/*count digits, white space, others */

#include <stdio.h>

int main()
{
int c, i, nwhite, nother;
int ndigit[10];

nwhite = nother = 0;
for(i=0;i<10;++i)
ndigit[i] = 0;    //initialise array

while ((c = getchar()) != EOF)
if(c >= '0' && c <= '9')
++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;    //increment whitespace counter
else
++nother;    //increment other counter

printf("digits =");
for(i = 0;i < 10;++i)
printf(" %d", ndigit[i]);    //print array elements
printf(", white space = %d, other = %d\n", nwhite, nother);
}```
Thanks
Dave

2. Since characters are represented with actual numbers (ASCII chart), it stands to reason that you can subtract a number from its value and you get a position.
It's a known solution to convert a character into its integer representative.
For example, if c is '9', c - '0' will give you 9.

3. ah, I see now - it converts char type into int to match the declaration.

Thanks
Dave

4. Originally Posted by droseman
ah, I see now - it converts char type into int to match the declaration.

Thanks
Dave
No, it converts char into int to make it an index into the array. And you can use ANY integer type to index into an array, char, int, long, unsigned char, unsigned int, unsigned long, enums, etc.

--
Mats

5. Basically, it converts the inputted number (which is a char) to the corresponding integer and uses it as the index for the array.