Параметри функції MAIN

Функція 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);

}

Час життя та область дії.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: