- •Материалы для подоговки к экзамену по дисциплине «основы программировния»
- •Тема №1 Основные понятия
- •Способы записи алгоритма
- •Тема №2 Переменные
- •Типы переменных
- •Типы с плавающей точкой
- •Переполнение переменных
- •Постфиксное обозначение типа
- •Шестнадцатеричный и восьмеричный формат
- •Экспоненциальная форма представления чисел
- •Объявление переменных
- •Начальное значение переменной
- •Область видимости переменной
- •Тема №3 Оператор присваивания
- •Ввод-вывод Форматированный вывод
- •Форматированный ввод
- •Непечатные символы
- •Тема №4 Ветвления и логические операторы
- •Оператор Switch
- •Логические операторы
- •Логическое отрицание
- •Логическое и
- •Логическое или
- •Пример: закон де-Моргана.
- •Порядок выполнения логических операторов
- •Тема №5 Циклы
- •Цикл с предусловием
- •Циклы с постусловием
- •Цикл for
- •Вложенные циклы
- •Тема №6 Одномерные массивы
- •Начальная инициализация массива.
- •Размер массива
- •Переполнение массива
- •Пример с одномерным массивом
- •Многомерные статические массивы
- •Пример с многомерным массивом
- •Тема №7 Строки в си. Введение
- •Чтение строк
- •Указатели
- •Определение
- •Арифметика указателей
- •Указатель на указатель
- •Указатели и приведение типов
- •Null pointer - нулевой указатель
- •Пример работы с указателями
- •Тема №8 Указатели и массивы
- •Многомерные массивы и указатели на многомерные массивы
- •Определение макросов
- •Тема №9 Тернарный оператор и оператор запятая
- •Оператор запятая.
- •Сегментация приложения на си
- •Тема №10 Динамическое выделение памяти
- •Освобождение памяти с помощью free
- •Работа с двумерными и многомерными массивами
- •Тема №11 Параметры командной строки
- •Функции
- •Параметры и аргументы
- •Передача аргументов По значению
- •По указателю (ссылке)
- •Передача массива в качестве аргумента
- •Тема №12 Битовые операции
- •Операции побитового сдвига
- •Примеры
- •Вопросы к экзамену по дисциплине «Основы программирования»
Передача массива в качестве аргумента
Как уже говорилось ранее, имя массива подменяется на указатель, поэтому передача одномерного массива эквивалентна передаче указателя. Пример: функция получает массив и его размер и выводит на печать:
#include <conio.h>
#include <stdio.h>
void printArray(int *arr, unsigned size) {
unsigned i;
for (i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
void main() {
int x[10] = {1, 2, 3, 4, 5};
printArray(x, 10);
getch();
}
В этом примере функция может иметь следующий вид
void printArray(int arr[], unsigned size) {
unsigned i;
for (i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
Правило подмены массива на указатель не рекурсивное. Это значит, что необходимо указывать размерность двумерного массива при передаче
#include <conio.h>
#include <stdio.h>
void printArray(int arr[][5], unsigned size) {
unsigned i, j;
for (i = 0; i < size; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void main() {
int x[][5] = {
{ 1, 2, 3, 4, 5},
{ 6, 7, 8, 9, 10}};
printArray(x, 2);
getch();
}
Либо, можно писать
#include <conio.h>
#include <stdio.h>
void printArray(int (*arr)[5], unsigned size) {
unsigned i, j;
for (i = 0; i < size; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void main() {
int x[][5] = {
{ 1, 2, 3, 4, 5},
{ 6, 7, 8, 9, 10}};
printArray(x, 2);
getch();
}
Если двумерный массив создан динамически, то можно передавать указатель на указатель. Например, функция, которая получает массив слов и возвращает массив целых, равных длине каждого слова:
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 10
unsigned* getLengths(const char **words, unsigned size) {
unsigned *lengths = NULL;
unsigned i;
lengths = (unsigned*) malloc(size * sizeof(unsigned));
for (i = 0; i < size; i++) {
lengths[i] = strlen(words[i]);
}
return lengths;
}
void main() {
char **words = NULL;
char buffer[128];
unsigned i;
unsigned *len = NULL;
words = (char**) malloc(SIZE * sizeof(char*));
for (i = 0; i < SIZE; i++) {
printf("%d. ", i);
scanf("%127s", buffer);
words[i] = (char*) malloc(128);
strcpy(words[i], buffer);
}
len = getLengths(words, SIZE);
for (i = 0; i < SIZE; i++) {
printf("%d ", len[i]);
free(words[i]);
}
free(words);
free(len);
getch();
}
Можно вместо того, чтобы возвращать указатель на массив, передавать массив, который необходимо заполнить
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 10
void getLengths(const char **words, unsigned size, unsigned *out) {
unsigned i;
for (i = 0; i < size; i++) {
out[i] = strlen(words[i]);
}
}
void main() {
char **words = NULL;
char buffer[128];
unsigned i;
unsigned *len = NULL;
words = (char**) malloc(SIZE * sizeof(char*));
for (i = 0; i < SIZE; i++) {
printf("%d. ", i);
scanf("%127s", buffer);
words[i] = (char*) malloc(128);
strcpy(words[i], buffer);
}
len = (unsigned*) malloc(SIZE * sizeof(unsigned));
getLengths(words, SIZE, len);
for (i = 0; i < SIZE; i++) {
printf("%d ", len[i]);
free(words[i]);
}
free(words);
free(len);
getch();
}
На этом первое знакомство с функциями заканчивается.
