resmen saçmalamış olabilir.

yine de fikir verebilir

. C bilen biri daha iyi anlatabilir tabi
#include <stdio.h>
void change(int *arr[], int *ss)
{
*arr[3] = *arr[0];
// arr[3]'e direkt atama yapılıyor. 67 değerini alıyor arr[3]
*arr[0] = 'V' - *ss;
// arr[0] 84 oldu *ss in neyi gösterdiğin bilmiyorum :D
*arr[1] = 'N' + 2 * (*ss);
// arr[1] 82 oldu. muhtemelen burdaki karakterlerin (N'nin) ascii lerinin matematiksel
// kodlarıyla oynayıp yeni karakterler elde ediyor.
if(*arr[1] == 'R')
// bu koşul sağlandığına göre. 82'nin R'nin ASCII kodu olduğunu söyleyebiliriz xD
// sonuçta array'de bunlar int olarak tutuluyor.
*arr[2] = 'N';
// arr[2]'ye N yani ascii koduyla 78 atandı
else if(*arr[1] == 'M')
// yukardaki if sağlandığı için buna girmedi.
*arr[2] = 'R';
// direkt değer ataması. arr[2] 78 oldu int olarak.
}
void main()
{
int a[5] = {'C','M','P','E'}; // bildigimiz dizi tanimlamasi 5. eleman yani a[4] bos
// ASCII ler
// a[0] = 67
// a[1] = 77
// a[2] = 80
// a[3] = 69
// a[4] = 0
int *arr[4];
arr[0]= a;
// burdaki a aslında dizinin ilk elemanının adresi. arr[0] da pointer olduğu için
// bu satır çalıştıktan sonra arr[0] = a[0] oluyor. yani arr[0] = 67 oluyor
arr[1]= a + 1;
// bir soraki eleman için. yani arr[0] = a[1] gibi
arr[2]= a + 2;
// devam
arr[3]= a + 3;
// ....
int s = 2, x=0;
change(arr,&s);
//bu kısmı yukarda fonksiyon içinde açıklamaya çalıştım.
for(x=0; x<4; x++)
// bu arrayin elemanlarını yazdırma döngüsü zaten.
printf("%c",*arr[x]);
}