Передача массива в качестве параметра в функцию
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

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

 

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));       //все слово по буквам

 

 

Дата: 2018-12-21, просмотров: 330.