Как ввести массив с клавиатуры в c
Перейти к содержимому

Как ввести массив с клавиатуры в c

  • автор:

Как ввести массив с клавиатуры в c

В языке Си массивы и указатели тесно связаны. С помощью указателей мы также легко можем манипулировать элементами массива, как и с помощью индексов.

Имя массива без индексов в Си является адресом его первого элемента. Соответственно через операцию разыменования мы можем получить значение по этому адресу:

#include int main(void) < int array[] = ; printf("array[0] = %d", *array); // array[0] = 1 return 0; >

Прибавляя определенное число к имени массива, мы можем получить указатель на соответствующий элемент массива:

#include int main(void) < int array[] = ; int second = *(array + 1); // получим второй элемент printf("array[1] = %d", second); // array[1] = 2 return 0; >

Более того, когда мы в обращаемся к определенному элементу массива, используя квадратные скобки, например:

array[2]

компилятор рассмотривает эту запись как прибавление индекса к указателю на начальный элемент:

array+2

Поэтому мы даже можем написать 2[array] , что также будет валидным обращением к элементу массива:

#include int main(void) < int array[] = ; int third = 2[array]; printf("array[2] = %d", third); // array[2] = 3 return 0; >

Соответственно мы можем пробежаться по всем элементом массива, прибавляя к адресу определенное число:

#include int main(void) < int array[5] = ; for(int i = 0; i < 5; i++) < void* address = array + i; // получаем адрес i-го элемента массива int value = *(array + i); // получаем значение i-го элемента массива printf("array[%d]: address=%p \t value=%d \n", i, address, value); >return 0; >

То есть, например, адрес второго элемента будет представлять выражение a+1 , а его значение — *(a+1) .

Со сложением и вычитанием здесь действуют те же правила, что и в операциях с указателями. Добавление единицы означает прибавление к адресу значения, которое равно размеру типа массива. Так, в данном случае массив представляет тип int , размер которого, как правило, составляет 4 байта, поэтому прибавление единицы к адресу означает увеличение адреса на 4. Прибавляя к адресу 2, мы увеличиваем значение адреса на 4 * 2 =8. И так далее.

В итоге в моем случае я получу следующий результат работы программы:

array[0]: address=0060FE98 value=1 array[1]: address=0060FE9C value=2 array[2]: address=0060FEA0 value=3 array[3]: address=0060FEA4 value=4 array[4]: address=0060FEA8 value=5

В то же время имя массива это не стандартный указатель, мы не можем изменить его адрес, например, так:

int array[5] = ; array++; // так сделать нельзя int b = 8; array = &b; // так тоже сделать нельзя

Использование указателя для работы с массивом

Имя массива всегда хранит адрес самого первого элемента, соответственно его можно присвоить другому указателю и затем через указатель обращаться к элеиментам массива:

#include int main(void) < int array[5] = ; int *ptr = array; // указатель ptr хранит адрес первого элемента массива array printf("value: %d \n", *ptr); // 1 return 0; >

Прибавляя (или вычитая) определенное число от адреса указателя, можно переходить по элементам массива. Например, перейдем к третьему элементу:

#include int main(void) < int array[5] = ; int *ptr = array; // указатель ptr хранит адрес первого элемента массива array ptr = ptr + 2; // перемезаем указатель на 2 элемента вперед printf("value: %d \n", *ptr); // value: 3 return 0; >

Здесь указатель ptr изначально указывает на первый элемент массива. Увеличив указатель на 2, мы пропустим 2 элемента в массиве и перейдем к элементу array[2] .

И как и другие данные, можно по указателю изменить значение элемента массива:

#include int main(void) < int array[5] = ; int *ptr = array; // указатель ptr хранит адрес первого элемента массива array ptr = ptr + 2; // переходим к третьему элементу *ptr = 8; // меняем значение элемента, на который указывает указатель printf("array[2]: %d \n", array[2]); // array[2] : 8 return 0; >

Стоит отметить, что указатель также может использовать индексы, как и массивы:

#include int main(void) < int array[5] = ; int *ptr = array; // указатель ptr хранит адрес первого элемента массива array int value = ptr[2]; // используем индексы - получаем 3-й элемент (элемент с индексом 2) printf("value: %d \n", value); // value: 3 return 0; >

Строки и указатели

Ранее мы рассмотрели, что строка по сути является набором символов, окончанием которого служит нулевой символ ‘\0’. И фактически строку можно представить в виде массива:

char hello[] = "Hello METANIT.COM!";

Но в языке Си также для представления строк можно использовать указатели на тип char :

#include int main(void) < char *hello = "Hello METANIT.COM!"; // указатель на char - фактически строка printf("%s", hello); return 0; >

В данном случае оба определения строки — с помощью массива и указателя будут в равнозначны.

Перебор массива с помощью указателей

С помощью указателей легко перебрать массив:

int array[5] = ; for(int *ptr=array; ptr

Так как указатель хранит адрес, то мы можем продолжать цикл, пока адрес в указателе не станет равным адресу последнего элемента ( ptr

Аналогичным образом можно перебрать и многомерный массив:

#include int main(void) < int array[3][4] = < , , >; int n = sizeof(array)/sizeof(array[0]); // число строк int m = sizeof(array[0])/sizeof(array[0][0]); // число столбцов int *final = array[0] + n * m - 1; // указатель на самый последний элемент for(int *ptr=array[0], i = 1; ptr > return 0; >

Так как в данном случае мы имеем дело с двухмерным массивом, то адресом первого элемента будет выражение array[0] . Соответственно указатель указывает на этот элемент. С каждой итерацией указатель увеличивается на единицу, пока его значение не станет равным адресу последнего элемента, который хранится в указателе final.

Мы также могли бы обойтись и без указателя на последний элемент, проверяя значение счетчика, пока оно не станет равно общему количеству элементов (m * n):

for(int *ptr = array[0], i = 0; i < m*n;) < printf("%d \t", *ptr++); if(++i%m==0) < printf("\n"); >>

Но в любом случае программа вывела бы следующий результат:

1 2 3 4 5 6 7 8 9 10 11 12

String interning

Стоит отметить, что в языке Си для работы со строками применяется такой механизм как string interning или интернирование строк . В этом случае строки в виде строковых литералов сохраняются в приложении в секции .rodata (read-only data), которые предназначены для данных только для чтения, а строковые литералы рассматриваются как неизменяемые данные. Например, возьмем следующую программу:

#include char* str1 = «Hello»; char* str2 = «World»; int main(void)

Здесь определены две строки — str1 и str2, в функции main выводим адрес первого символа каждой из этих строк. Так, в моем случае я получу вывод:

str1 = 00007FF75E674000 str2 = 00007FF75E674006

По выводу видно, что первый символ второй строки расположен через 6 байтов начала первой строки. То есть строки расположены в памяти рядом друг с другом.

Но теперь сделаем строки одинаковыми:

#include char* str1 = «Hello World»; char* str2 = «Hello World»; int main(void)

Теперь вывод будет другим:

str1 = 00007FF75F674000 str2 = 00007FF75F674000

Оба адреса одинаковые, потому что обе переменных в реальности указывают на одну и ту же строку. Интернирование строк позволяет избежать дублирования строк, более эффективно использовать память. Причем здесь не важно, что переменные являются глобальными. Они также могут быть локальными, но все равно будут указывать на один и тот же адрес в .rodata .

#include int main(void)

Ввод элементов массива с клавиатуры

Author24 — интернет-сервис помощи студентам

Ввод элементов матрицы с клавиатуры
у меня дано СЛАУ методом гаусса: #include <stdio.h> #include <conio.h> #include <math.h>.

Ввод заранее неизвестного количества чисел массива с клавиатуры
Как написать код, чтобы пользователь вводил числа в массив количество элементов которого не известно

Найти произведение элементов массива, элементы массива ввести с клавиатуры
чет вообще который час туплю,хелпайте плз) УКАЗАТЕЛИ И МАССИВЫ 1 Найти произведение.

Определение и вывод номеров минимальных элементов двумерного массива и ввод массива меньшей размерности
Доброго времени суток. Пожалуйста, помогите с решением задания. Заранее спасибо. Исходная.

81 / 81 / 33
Регистрация: 03.03.2013
Сообщений: 311
Вот так можно:

1 2 3 4 5 6
printf("vvod 5 cil chisel:"); for(i=0;i5;i++) { printf("A[%d]=",i); scanf("%i",&A[i]); }

Ошибка у Вас в том, что вы заносите по адресу A[9], хотя Вы сами же задали константу N, то есть у Вас елементы могут находится от A[0] до A[8].

Добавлено через 10 минут
И ещё, Вы хотите ввести 5 елементов, а отсортировуете 9, вместе с «мусором». Можете лучше ввести все 9 елементов, мой код

for(i=0;i5;i++)

С клавиатуры ввести массив целых чисел [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 3 года назад .

#define _CRT_SECURE_NO_WARNINGS #include #define N 25 int main() < system("chcp 1251"); int arr[N]; int* p1, * p2, * pel; p1 = &arr[0], p2 = p1 + N - 1; int k = 0; int arr2[N], * parr2, * parr3; printf("\nВведіть елементи (не більше %d), кінець введення – " "довільний символ \n", N); while (k < N) < if (scanf("%d", arr + k) == 0) break; k++; >parr2 = &arr2[0]; parr3 = parr2 + N - 1; for (pel = arr+1; pel < p2; pel++) pel % p1 == 0; parr2 = pel; for (; parr2 < parr3; parr2++) printf("%4d", *parr2); return 0; 

С клавиатуры ввести массив целых чисел . Сформировать новый массив из тех элементов введенного массива, которые целочисленных делятся на его первый элемент. напечатать созданный массив или вывести сообщение об отсутствии таких элементов. Не очень понимаю как делать но что-то попытался сделать

Ввод строки с клавиатуры

Задача: ввод строки с клавиатуры строки (состоящей из нескольких слов) и запись её в массив для дальнейшего использования.

char nazv_sh[100]; cout  

При запуске после того, как высвечивается предложение о вводе, вводишь одну букву, и программа вылетает. Не пойму, в чём дело, и как тут правильно поступить.

Отслеживать
14k 34 34 серебряных знака 46 46 бронзовых знаков
задан 8 янв 2014 в 12:34
51 2 2 золотых знака 4 4 серебряных знака 12 12 бронзовых знаков
@Дарьялла а у меня работает. Но вообще iostream и gets смешивать нехорошо.
8 янв 2014 в 12:55
а как можно ещё сделать, чтобы добиться выполнения поставленной задачи?
8 янв 2014 в 13:02
Должно работать. А iostream c stdio по умолчанию синхронизируются.
26 апр 2015 в 21:22

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

У меня все работает. Вообще, как писали выше, не надо смешивать stdio и iostream . Если пишете на плюсах, то делайте что-то вида:

char nazv_sh[100]; cout > nazv_sh; 

Отслеживать
user177221
ответ дан 8 янв 2014 в 17:22
405 2 2 серебряных знака 6 6 бронзовых знаков

@gothmog, cin >> прочтет очередное "слово", а не строку. Чтение строки (в нормальных крестах) в string string str; getline(cin, str); А в char[] , конечно, stdio: fgets(nazv_sh, sizeof(nazv_sh), stdin); nazv_sh[strlen[nazv_sh] - 1] = 0;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *