Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы для подготовки к экзамену по ОП.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
298 Кб
Скачать
☆

Передача массива в качестве аргумента

Как уже говорилось ранее, имя массива подменяется на указатель, поэтому передача одномерного массива эквивалентна передаче указателя. Пример: функция получает массив и его размер и выводит на печать:

#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();

}

На этом первое знакомство с функциями заканчивается.