Функція main може мати такі параметри:
main(int arg c,char*argv[], char*envp[])
Тут argc – кількість параметрів, що передаються у функцію main, має тип int; arg v – масив покажчиків на тип char:char*argv[].
Кожен покажчик містить адресу наступного аргументу. Значення arg c завжди >1, оскільки обов'язковим параметром є ім'я файла вихідної С -програми
main(int arg c,char*arg v)
{printf("ім’я файла – %s',argv[0]);
return 0;
}
де envp – масив покажчиків на тип char:char*envp[]. Він містить змінні оточення операційної системи. Для роботи зі змінними оточення використовуються функції
char*getenv(char*varname) та void putenv (char*var).
Функція getenv дає можливість отримати значення в списку змінних оточення, putenv добавляє в список змінних оточення рядок. Наприклад, функція char*s=getenv(PATH).
Рядок var має бути конструкцією вигляду varname=string. Наприклад:
char*s='PATH=e:\bc\my\';
putenv(s);
Параметри функції main задаються в командному рядку операційної системи при запуску програми. Розглянемо функцію, що друкує всі аргументи командного рядка:
main(int argc,char*argv,char*envp)
{for(int i=0;i<argc;i++);
printf("%s\n',argv[i]);
|
|
return 0;
}
Лiтернi покажчики та функцiї
Покажчик на тип char можна ініціалізувати символьними рядками:
char*pc='abc';
Аналогічно можна ініціалізувати масив елементів типу char:
char c[ ]={'a','b','c'};
Тоді
pc[0]==c[0]=='a', pc[1]==c[1]=='b', pc[2]==c[2]=='c'.
Однак перше та друге визначення мають відмінність. Вона полягає в тому, що рядкова константа обов’язково містить 0 -символ. Тому pc[3]=='\0'. Це потрібно враховувати при роботі з функціями, які працюють із рядками. Такі функції можуть містити конструкцію
while(*s!='\0')s++;
Тоді при передаванні імені масиву на вхід функції може бути не знайдено 0 -символ, і функція спрацює некоректно. Наприклад:
void strcpy(char*s,char*t)
{int i=0
while(s[i]=t[i]!='\0')i++;
}
Цю функцію можна записати й так:
void strcpy(char*s,char*t)
{while(*s++=*i++);}
Сама функція в мові С не є змінною, хоча її ім'я містить адресу точки входу у функцію. Цю ситуацію можна обійти, якщо використовується покажчик на функцію:
[<спец. типу>](*iм'я)(<список типiв параметрiв>)
Проілюструємо це двома програмами:
double (*f)(int);
extern double f1(int),f2(int);
Main()
{
int n;double s;
scanf("%d",&n);
if(n>0)f=f1; else f=f2;
for(i=0;i<100;i++)
s+=(*f)(i);
}
extern int f1(int),f2(int);
extern void work(int,int(*)(int));
{main()
work(1,f1);
work(2,f2);
}
Час життя та область дії.