はい。cのプログラムでは必ず main() が実行されます。この関数だけ特別です。

関数を定義するのは、一番外側でしか行えません。
mainなどの関数の中では関数を定義できません。一番外側ではないので。(もちろん、関数を使うだけならできます)

以下は、hello world と表示し、数字を1増やし、その数字も表示する。 これを3回繰り返すプログラムです。

#include <stdio.h>
int i=0;

void main() {
    printf("hello world");    i = i+1;    printf("%d", i);
    printf("hello world");    i = i+1;    printf("%d", i);
    printf("hello world");    i = i+1;    printf("%d", i);  
}

この 「hello world と表示して、数字を1増やし、数字も表示する」という部分は、結局3回とも同じ手順ですよね?
だから、この部分を関数としてまとめてしまえば、目的がシンプルになって読みやすくなります。 main() を見て「なにかを3回するんだな」ということが簡単にわかります。

#include <stdio.h>
int i =0;

void many(void) {
    printf("hello world");    i = i+1;    printf("%d", i);
}

void main() {
    many();    many();    many();
}

「many() が具体的に何を行うか?」は、とりあえず知らなくても、main()で「なにかを3回するんだな」と読めます。 こうすればいちいち処理の詳細を知らなくても簡単に読めます。
関数は、こうやって「プログラムを簡単に読めるようにするため」に使います。 簡単に読めるプログラムを書くのは、高速なプログラムを書くのと同じくらい高度で知的な作業です。