sinc(x/n) = n/2 \int_{-1/n}^{1/n} d t e^{i t x}.
Next, notice that \int_0^\infty sinc(x) \dots sinc(x/n) = 1/2 \int_{-\infty}^\infty sinc(x) \dots sinc(x/n).
Next, replace the sinc functions by their Fourier representation, change the order of integration and use the formula \int_{-\infty}^\infty d x e^{i a x} = 2 pi \delta(a),
where \delta(a) is the Dirac delta. You are left with an integral of a delta function over a product of intervals. What remains to be done is just some tedious computation.
Means that when I dereference the variable pi, I get an int. This also explains why
declares `pi` as a pointer to `int` and `i` as an `int`. From this point of view it makes sense stylistically to put * near the variable.
Declaration of array types is similar. For example,
means that when I take an element of `arr`, I obtain an `int`. Hence, `arr` is an array of ints.
Pointers to functions work the same way. For example,
means that if I dereference the variable `f` and I evaluate it on a `char` and on a `double`, then I get an `int`. Hence, the type of `f` is "pointer to function which takes as arguments a char and a double and returns an int".