Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


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




 

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

 

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

 

 





Поделиться с друзьями:


Дата добавления: 2016-11-23; Мы поможем в написании ваших работ!; просмотров: 375 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Победа - это еще не все, все - это постоянное желание побеждать. © Винс Ломбарди
==> читать все изречения...

2221 - | 2053 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.009 с.