Передача массива в качестве параметра в функцию
Указатель можно передавать в функцию в качестве параметра:
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)); //все слово по буквам
Указатель как возвращаемое значение функции