1.
Defining a array at the start of a program outside any function (including main), declares it as a global variable. It will be valid in all functions (including main) unless a local variable with the same name is defined within a function.
This is useful if a function always accesses the same array. However, if you have a function that is used with different arrays (or other variables) from different calls within your program, then it is better to pass the variable or a pointer to the variable to the called function.
2.
A C program has a list of parameters that count from 0 upwards. For example, with a program called my_prog:
my_prog param_A param_B
Parameter 0 is "my_prog"
Parameter 1 is "param_A"
Parameter 2 is "param_B"
Parameter 0 is always the name that was used to invoke the program. In some cases in UNIX/Linux systems, where two utility programs do very similar jobs, the same executable is used, with two different outcomes depending upon which name was used to invoke it. The program checks what name was used and reacts accordingly.
The Linux "busybox" program is a single executable that performs many different utility functions. In DSL Linux there are around 145 system utilities that can be called simply by using symbolic links to /bin/busybox. The busybox executable selects what it has to do depending upon what name was used to call it. The list of utilities in my copy of DSL Linux busybox is:
[, [[, ar, arping, awk, basename,
bunzip2, busybox, bzcat, cal, cat, chgrp,
chmod, chown, chroot, clear, cpio,
cut, date, dd, df, diff, dirname, dmesg,
dos2unix, du, echo, egrep, eject,
env, expr, false, fdflush, fdformat, fdisk,
fgrep, find, fold, free, freeramdisk,
fsck.minix, getty, grep, gunzip,
gzip, head, hexdump, hostid, hostname,
hwclock, id, ifconfig, ifdown, ifup,
insmod, install, ip, ipcalc, kill,
killall, klogd, last, length, less,
ln, loadfont, loadkmap, logger, logname,
logread, ls, lsmod, md5sum, mesg,
mkdir, mkfifo, mkfs.minix, mknod,
mkswap, mktemp, modprobe, more, mount,
mv, netstat, nice, nohup, nslookup, od,
passwd, pidof, ping, printenv, printf,
ps, pwd, readlink, realpath, renice,
reset, rm, rmdir, rmmod, route,
rpm2cpio, run-parts, sed, setkeycodes,
sleep, sort, stat, strings, stty, sum,
swapoff, swapon, sync, syslogd, tail,
tee, test, time, top, touch, tr,
traceroute, true, tty, uname, uncompress,
uniq, unix2dos, unzip, uptime, usleep,
uudecode, uuencode, watch, wc, wget,
which, who, whoami, xargs, yes, zcat
The busybox executable is around 375 kB in size. This averages out at around 2.6 kB per utility. It also means there is space wasted on only one allocation unit of the file system rather than 145 potential allocation units if each function was coded separately.