Передача массива в качестве параметра в функцию

 

Указатель можно передавать в функцию в качестве параметра:

 

void main(void){

int age[10];

............

sum (age);

..........

}

void sum (int year[]){}

 

Описатель int year[] - создает указатель на массив age. Можно по другому.

void sum (int*pm){}.

 

pm+3 <=> year[3] <=> age[3] одно и тоже pm[3].

int* pm и int pm[]; - одно и тоже

 

Пример: Создадим функцию для определения среднего значения в массиве.

float var (int*pm, int i){ //передаем адрес массива и количество

//элементов.

float sum=0;

int k;

for (k=0; k<i; k++)

sum+=*pm++; //*(pm+k)или pm[k]

returm (sum/i); //возвращаем среднее значение в

} //вызывающую функцию.

void main(void){

int mas[3][4]={ {1, 2, 3, 4},

{5, 6, 7, 8},

{9, 10, 11, 12} };

int i;

for (i=0; i<3; i++)

printf ("Среднее значение строки %d равно %4.2f.\n", i+1,

var(mas[i],4));

}

 

Работаем с двумерным массивом как одномерным, передавая в функцию его адрес и количество элементов. Каждая строка – это одномерный массив.

Если нужно передать массив в функцию как двумерный.

float var(int mas[][4]),т.е. разбивает массив на строки по 4 столбца.

 

13.8 Указатель на void *

 

Объявление void *vptr; объявляет, что vptr - это родовой указатель, которому может быть присвоено любое значение "указатель на тип type" без выдачи компилятором сообщений. Без правильного приведения типов между "указателем на тип type1" и "указателем на тип type2", где type1 и type2 это различные типы, присвоение может вызвать предупреждение или ошибку компилятора. Если type1 это указатель на void, приведения типов не требуется.

int max(void *, void *);

void main(void) {

int x=5, y=10;

int k=max((void *)&x, (void *)&y);

(k==0)?puts(«x>y»): puts(«x<y»);

}

int max(void *a,void *b) {

return((*a>*b)?0:1);

}

 

СИМВОЛЬНЫЕ СТРОКИ И ФУНКЦИИ НАД СТРОКАМИ

 

Всякий раз, когда компилятор встречается с чем-то заключённым в кавычки, он определяет это как строковую константу. Символы+'\0' записыватся в последовательные ячейки памяти. Если необходимо включить кавычки в символьную строку, нужно поставить впереди \".

Строковые константы размещаются в области данных. Вся фраза в кавычках является указателем на место в памяти, где записана строка. Это аналогично имени массива, служащего указателем на адрес расположения массива. Для вывода символьной константы служит идентификатор %s.

 

char mas[] = "Это одна строка";

mas - адрес строки -> &m[0] *mas=='Э'.

Можно использовать указатель для создания строки.

char *str = "Таблица результатов";

char str[]= "Таблица результатов".

Сама строка размещается в области данных, а указатель инициализируется адресом.

 

void main(void){

char* mesg="Ошибка чтения";

char* copy;

copy = mesg; создается второй указатель на строку.

printf ("%S", copy);

printf ("%S", mesg);

}

char* name;

scanf ("%S", name); //Так нельзя !!! Указателю не присвоен адрес.

char name [81]; //Нужно в начале определить массив

 

Массивы символьных строк

 

1. Строки в символьный массив можно вводить с клавиатуры.

char mas[80];

scanf("%S",mas);

 

2. Если требуется несколько строк, то организуем цикл ввода

char mas[4][81];

for (i=0; i<4; i++)

sсanf("%S", mas[i]); // &mas[i][0]

 

3. Можно сразу инициализировать в программе.

char m1[] = "Только одна строка"; // автоматически определяется

// длина строки + 1 байт на '\0'.

4. Размер массива можно задать явно.

char m2[50] = "Только одна строка"; //18+1

5. char m3[]={'c', 'm', 'p', 'o', 'k', 'a', '\o'};

6. Инициализация массива строк:

char masstr[3][16]={"Первая строка",

"Вторая строка",

"Третья строка" };

*masstr[0]=='П';

*masstr[1]=='B';

*masstr[2]=='Т';

 

printf(“\n %c”, *masstr[i]); //печать одной буквы

printf(“\n %s”, *(masstr+i)); //печать строки

printf(“\n %u”, masstr[i]); //печать адреса строки

 

7. «Рваный массив» – это массив указателей на строки.

static char *masstr[3]= {"Первая строка",

"Вторая строка",

"Третья строка" };

В случае «рваного массива» длина строк разная и зря не расходуется память.

 

Массивы указателей

 

Можно определять массивы указателей

int* parray[5]; //5 указателей на целые значения.

*parray[3] - //3-й элемент массива.

char *keywords[5]={"ADD", "CHANGE", "DELETE", "LIST", "QUIT"};

 

В памяти:

keyword[0] – адрес 10000 строка ADD\0 4б

keyword[1] - 10004 CHANGE\0 7б

keyword[2] - 10011 DELETE\0 7б

 

for (i=0; i<5; i++)

printf("%s", keywords[i]); //печать строки

 

char *key[3],**pt; //определение указателя на указатель

pt=key;

printf(“%s %d\n”,*pt,**pt); //печатается первая строка и код первой буквы

for (i=0; i<5; i++)

printf(“%c ”,**(pt+i)); //все первые буквы строк

 

for (i=0; i<3; i++)

printf(“%c ”,*(*pt+i)); //все слово по буквам