- •Основные характеристики алгоритмического языка Си
- •Идентификаторы
- •Вопрос 2
- •Константы
- •Целый тип (int)
- •Символьный тип (char)
- •Инициализация переменных
- •Определение именованных констант
- •Унарные операции
- •Бинарные операции
- •Преобразование типов
- •Внимание!
- •Оператор принятия решений switch
- •Оператор цикла while
- •Оператор цикла do/while
- •Оператор continue
- •Оператор goto
- •Указатели
- •Int *a. B, *c; описываются два указателя на целое с именами а и с, а также целая переменная b.
- •Инициализация указателей
- •Массивы
- •Внимание
- •Связь массива с указателем.
- •Многомерные массивы.
- •Функции
- •Объявление и определение функций
- •Локальные и глобальные переменные.
- •Класс памяти
- •Параметры функции
- •Передача массивов в функции
Передача массивов в функции
При использовании в качестве параметра функции массива в функцию передается указатель на его первый элемент, а не копия всего массива. т.е. массив всегда передается по адресу. (Следует помнить, что в языке С имена массивов без индекса – это указатели на нулевой элемент массива.) Параметр должен иметь тип, совместимый с указателем, т.е. элементами массива.
Т.к. работаем с указателями, то информация о количестве элементов массива теряется, и следует передавать его размерность через отдельный параметр (в случае массива символов, то есть строки, ее фактическую длину можно определить по положению нуль-символа):
Имеется три способа объявления параметра, предназначенного для получения указателя на массив.
Во-первых, он может быть объявлен как массив, как показано ниже:
#include <stdio.h>
void vivod(int num[10], int n);
int main(void)
{
int t[10], i;
for(i=0; i<10; i++) t[i]=i;
vivod (t,10);
return 0;
}
void vivod (int num[10])
// void display(int num[],int n)
// void display(int *num,int n)
{
int i;
for(i=0; i<n; i++) printf(“%d “, num[i]);
}
Все, приведенные выше, три способа объявления параметра приводят к одинаковому результату – указателю.
При использовании массива в качестве аргумента функции происходит передача в функцию его адреса. Это позволяет непосредственно из вызываемой функции изменять значения объектов, определённых в вызывающей функции.
Пример Даны два одномерных массива. Вывести упорядоченные массивы , и упорядоченный массив, объединенный из элементов двух массивов
#include<stdio.h>
#include<conio.h>
void input(float *,int );
void sort(float *,int );
void output(float *,int );
main()
{
int i,j,k,n1,n2;
printf("Vv n1 and n2:");
scanf("%d%d",&n1,&n2);
float *a=new float[n1];
float *b=new float[n2];
float *c=new float[n1+n2];
input(a,n1);
input(b,n2);
sort(a,n1);
sort(b,n2);
output(a,n1);
output(b,n2);
for (i=j=k=0;i<n1+n2;i++)
if((a[j]<=b[k]||k>=n2)&&j<n1) {c[i]=a[j];j++;}
else {c[i]=b[k];k++;}
output(c,n1+n2);
getche();
return 0;
}
void input(float *a,int n )
{
int i;
for(i=0;i<n;i++)
{printf("Vv %3d element:",i+1);
scanf("%f",&a[i]);
}
}
void sort(float *a,int n)
{
int i,j;
float tmp;
for(i=1;i<n;i++)
{tmp=a[i];
for(j=i-1;j>=0;j--)
{if(tmp>a[j]) break;
a[j+1]=a[j];
}
a[j+1]=tmp;
} }
void output(float *a,int n)
{int i;
for(i=0;i<n;i++)
printf("%.3f ",a[i]);
printf("\n");
}